1+ # -*- coding: utf-8 -*-
2+ # @Time : 2022/2/8 20:50
3+ # @Author : @qiu-lzsnmb and @Dimlitter
4+ # @File : auto_comment_plus.py
5+
6+ import random
7+ import time
8+ import jieba .analyse
9+ import requests
10+ from lxml import etree
11+ import jdspider
12+
13+ jieba .setLogLevel (jieba .logging .INFO )
14+ """
15+ ck填到下面就好,只支持网页版的Ck
16+ 以下为最短格式
17+ """
18+ ck = ''
19+
20+ headers = {
21+ 'cookie' : ck ,
22+ 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36' ,
23+ }
24+
25+
26+ # 评价生成
27+ def generation (pname , _class = 0 , _type = 1 ):
28+ list = ['商品名' ]
29+ list .clear ()
30+ list .append (pname )
31+ for item in list :
32+ spider = jdspider .JDSpider (item )
33+ result = spider .getData (3 , 3 ) #这里可以自己改
34+
35+ # 0是追评 1是评价
36+ # class 0是评价 1是提取id
37+ try :
38+ name = jieba .analyse .textrank (pname , topK = 5 , allowPOS = 'n' )[0 ]
39+ except :
40+ name = "宝贝"
41+ if _class == 1 :
42+ return name
43+ else :
44+ datas = {
45+ 1 : {
46+ "开始" : result ,
47+ "中间" : result , #重复的几率不大,相信我(
48+ "结束" : result
49+ },
50+ 0 : {
51+ "开始" : result ,
52+ "中间" : result ,
53+ "结束" : result
54+ }
55+ }
56+ if _type == 1 :
57+ comments = datas [_type ]
58+ return random .randint (3 , 5 ), (
59+ random .choice (comments ["开始" ]) + random .choice (comments ["中间" ]) + random .choice (comments ["结束" ])).replace (
60+ "$" , name )
61+ elif _type == 0 :
62+ comments = datas [_type ]
63+ return (
64+ random .choice (comments ["开始" ]) + random .choice (comments ["中间" ]) + random .choice (comments ["结束" ])).replace (
65+ "$" , name )
66+
67+
68+ # 查询全部评价
69+ def all_evaluate ():
70+ N = {}
71+ url = 'https://club.jd.com/myJdcomments/myJdcomment.action?'
72+ req = requests .get (url , headers = headers )
73+ req_et = etree .HTML (req .text )
74+ evaluate_data = req_et .xpath ('//*[@id="main"]/div[2]/div[1]/div/ul/li' )
75+ # print(evaluate)
76+ for i , ev in enumerate (evaluate_data ):
77+ na = ev .xpath ('a/text()' )[0 ]
78+ try :
79+ num = ev .xpath ('b/text()' )[0 ]
80+ except IndexError :
81+ num = 0
82+ N [na ] = int (num )
83+ return N
84+
85+
86+ # 普通评价
87+ def ordinary (N ):
88+ Order_data = []
89+ req_et = []
90+ for i in range ((N ['待评价订单' ] // 20 ) + 1 ):
91+ url = f'https://club.jd.com/myJdcomments/myJdcomment.action?sort=0&page={ i + 1 } '
92+ req = requests .get (url , headers = headers )
93+ req_et .append (etree .HTML (req .text ))
94+ for i in req_et :
95+ Order_data .extend (i .xpath ('//*[@id="main"]/div[2]/div[2]/table/tbody' ))
96+ if len (Order_data ) != N ['待评价订单' ]:
97+ Order_data = []
98+ for i in req_et :
99+ Order_data .extend (i .xpath ('//*[@id="main"]/div[2]/div[2]/table' ))
100+
101+ print (f"当前共有{ N ['待评价订单' ]} 个评价。" )
102+ for i , Order in enumerate (Order_data ):
103+ oid = Order .xpath ('tr[@class="tr-th"]/td/span[3]/a/text()' )[0 ]
104+ oname_data = Order .xpath ('tr[@class="tr-bd"]/td[1]/div[1]/div[2]/div/a/text()' )
105+ pid_data = Order .xpath ('tr[@class="tr-bd"]/td[1]/div[1]/div[2]/div/a/@href' )
106+ for oname , pid in zip (oname_data , pid_data ):
107+ pid = pid .replace ('//item.jd.com/' , '' ).replace ('.html' , '' )
108+
109+ print (f"\t { i } .开始评价订单\t { oname } [{ oid } ]" )
110+ url2 = f"https://club.jd.com/myJdcomments/saveProductComment.action"
111+ xing ,Str = generation (oname )
112+ xing = 5 #写死五星
113+ print (f'\t \t 评价内容,星级{ xing } :' , Str )
114+ data2 = {
115+ 'orderId' : oid ,
116+ 'productId' : pid , # 商品id
117+ 'score' : str (xing ), # 商品几星
118+ 'content' : bytes (Str , encoding = "gbk" ), # 评价内容
119+ 'saveStatus' : '1' ,
120+ 'anonymousFlag' : '1'
121+ }
122+ pj2 = requests .post (url2 , headers = headers , data = data2 )
123+ time .sleep (20 )
124+ N ['待评价订单' ] -= 1
125+ return N
126+
127+
128+ # 晒单评价
129+ def sunbw (N ):
130+ Order_data = []
131+ for i in range ((N ['待晒单' ] // 20 ) + 1 ):
132+ url = f"https://club.jd.com/myJdcomments/myJdcomment.action?sort=1&page={ i + 1 } "
133+ req = requests .get (url , headers = headers )
134+ req_et = etree .HTML (req .text )
135+ Order_data .extend (req_et .xpath ('//*[@id="evalu01"]/div[2]/div[1]/div[@class="comt-plist"]/div[1]' ))
136+ print (f"当前共有{ N ['待晒单' ]} 个需要晒单。" )
137+ for i , Order in enumerate (Order_data ):
138+ oname = Order .xpath ('ul/li[1]/div/div[2]/div[1]/a/text()' )[0 ]
139+ pid = Order .xpath ('@pid' )[0 ]
140+ oid = Order .xpath ('@oid' )[0 ]
141+
142+ print (f'\t 开始晒单{ i } ,{ oname } ' )
143+ # 获取图片
144+ pname = generation (pname = oname , _class = 1 )
145+ url1 = f"https://club.jd.com/discussion/getProductPageImageCommentList.action?productId={ pid } "
146+ imgdata = requests .get (url1 , headers = headers ).json ()
147+ if imgdata ["imgComments" ]["imgCommentCount" ] == 0 :
148+ url1 = "https://club.jd.com/discussion/getProductPageImageCommentList.action?productId=1190881"
149+ imgdata = requests .get (url1 , headers = headers ).json ()
150+ imgurl = imgdata ["imgComments" ]["imgList" ][0 ]["imageUrl" ]
151+
152+ #
153+ print (f'\t \t 图片url={ imgurl } ' )
154+ url2 = "https://club.jd.com/myJdcomments/saveShowOrder.action" # 提交晒单
155+ headers ['Referer' ] = 'https://club.jd.com/myJdcomments/myJdcomment.action?sort=1'
156+ headers ['Origin' ] = 'https://club.jd.com'
157+ headers ['Content-Type' ] = 'application/x-www-form-urlencoded'
158+ data = {
159+ 'orderId' : oid ,
160+ 'productId' : pid ,
161+ 'imgs' : imgurl ,
162+ 'saveStatus' : 3
163+ }
164+ req_url2 = requests .post (url2 , data = {
165+ 'orderId' : oid ,
166+ 'productId' : pid ,
167+ 'imgs' : imgurl ,
168+ 'saveStatus' : 3
169+ }, headers = headers )
170+ print ('完成' )
171+ time .sleep (50 )
172+ N ['待晒单' ] -= 1
173+ return N
174+
175+
176+ # 追评
177+ def review (N ):
178+ req_et = []
179+ Order_data = []
180+ for i in range ((N ['待追评' ] // 20 ) + 1 ):
181+ url = f"https://club.jd.com/myJdcomments/myJdcomment.action?sort=3&page={ i + 1 } "
182+ req = requests .get (url , headers = headers )
183+ req_et .append (etree .HTML (req .text ))
184+ for i in req_et :
185+ Order_data .extend (i .xpath ('//*[@id="main"]/div[2]/div[2]/table/tr[@class="tr-bd"]' ))
186+ if len (Order_data ) != N ['待追评' ]:
187+ for i in req_et :
188+ Order_data .extend (i .xpath ('//*[@id="main"]/div[2]/div[2]/table/tbody/tr[@class="tr-bd"]' ))
189+ print (f"当前共有{ N ['待追评' ]} 个需要追评。" )
190+ for i , Order in enumerate (Order_data ):
191+ oname = Order .xpath ('td[1]/div/div[2]/div/a/text()' )[0 ]
192+ _id = Order .xpath ('td[3]/div/a/@href' )[0 ]
193+ print (f'\t 开始第{ i } ,{ oname } ' )
194+ url1 = "https://club.jd.com/afterComments/saveAfterCommentAndShowOrder.action"
195+ pid , oid = _id .replace ('http://club.jd.com/afterComments/productPublish.action?sku=' , "" ).split ('&orderId=' )
196+ context = generation (oname , _type = 0 )
197+ print (f'\t \t 追评内容:{ context } ' )
198+ req_url1 = requests .post (url1 , headers = headers , data = {
199+ 'orderId' : oid ,
200+ 'productId' : pid ,
201+ 'content' : bytes (context , encoding = "gbk" ),
202+ 'anonymousFlag' : 1 ,
203+ 'score' : 5
204+ })
205+ print ('完成' )
206+ time .sleep (30 )
207+ N ['待追评' ] -= 1
208+ return N
209+
210+
211+ # 服务评价
212+ def Service_rating (N ):
213+ Order_data = []
214+ req_et = []
215+ for i in range ((N ['服务评价' ] // 20 ) + 1 ):
216+ url = f"https://club.jd.com/myJdcomments/myJdcomment.action?sort=4&page={ i + 1 } "
217+ req = requests .get (url , headers = headers )
218+ req_et .append (etree .HTML (req .text ))
219+ for i in req_et :
220+ Order_data .extend (i .xpath ('//*[@id="main"]/div[2]/div[2]/table/tbody/tr[@class="tr-bd"]' ))
221+ if len (Order_data ) != N ['服务评价' ]:
222+ Order_data = []
223+ for i in req_et :
224+ Order_data .extend (i .xpath ('//*[@id="main"]/div[2]/div[2]/table/tr[@class="tr-bd"]' ))
225+ print (f"当前共有{ N ['服务评价' ]} 个需要服务评价。" )
226+ for i , Order in enumerate (Order_data ):
227+ oname = Order .xpath ('td[1]/div[1]/div[2]/div/a/text()' )[0 ]
228+ oid = Order .xpath ('td[4]/div/a[1]/@oid' )[0 ]
229+ print (f'\t 开始第{ i } ,{ oname } ' )
230+ url1 = f'https://club.jd.com/myJdcomments/insertRestSurvey.action?voteid=145&ruleid={ oid } '
231+ data1 = {
232+ 'oid' : oid ,
233+ 'gid' : '32' ,
234+ 'sid' : '186194' ,
235+ 'stid' : '0' ,
236+ 'tags' : '' ,
237+ 'ro591' : f'591A{ random .randint (4 , 5 )} ' , # 商品符合度
238+ 'ro592' : f'592A{ random .randint (4 , 5 )} ' , # 店家服务态度
239+ 'ro593' : f'593A{ random .randint (4 , 5 )} ' , # 快递配送速度
240+ 'ro899' : f'899A{ random .randint (4 , 5 )} ' , # 快递员服务
241+ 'ro900' : f'900A{ random .randint (4 , 5 )} ' # 快递员服务
242+ }
243+ pj1 = requests .post (url1 , headers = headers , data = data1 )
244+ print ("\t \t " , pj1 .text )
245+ time .sleep (25 )
246+ N ['服务评价' ] -= 1
247+ return N
248+
249+
250+ def No ():
251+ print ()
252+ N = all_evaluate ()
253+ for i in N :
254+ print (i , N [i ], end = "----" )
255+ print ()
256+ return N
257+
258+
259+ def main ():
260+ print ("开始京东批量评价!" )
261+ N = No ()
262+ if not N :
263+ print ('Ck出现错误,请重新抓取!' )
264+ exit ()
265+ if N ['待评价订单' ] != 0 :
266+ print ("1.开始普通评价" )
267+ N = ordinary (N )
268+ N = No ()
269+ if N ['待晒单' ] != 0 :
270+ print ("2.开始晒单评价" )
271+ N = sunbw (N )
272+ N = No ()
273+ if N ['待追评' ] != 0 :
274+ print ("3.开始批量追评!" )
275+ N = review (N )
276+ N = No ()
277+ if N ['服务评价' ] != 0 :
278+ print ('4.开始服务评价' )
279+ N = Service_rating (N )
280+ N = No ()
281+ print ("全部完成啦!" )
282+ for i in N :
283+ if N [i ] != 0 :
284+ print ("出现了二次错误,跳过了部分,重新尝试" )
285+ main ()
286+
287+
288+ if __name__ == '__main__' :
289+ try :
290+ main ()
291+ except RecursionError :
292+ print ("多次出现未完成情况,程序自动退出" )
0 commit comments