写个Python程序上下班抢个顺风单 |
您所在的位置:网站首页 › 滴滴辅助抢单脚本 › 写个Python程序上下班抢个顺风单 |
一 程序预览
本程序已经写了多年, 很久没用, 不过刚运行了下竟然还可以成功运行. 先来张运行结果图. 1. 这个小程序运行在电脑上, 人在回家的路上, 有时不想接单了也不好控制. 于是我把一些参数都写到坚果云下的一个文本文件里, 手机上也装一个坚果云, 如果不想接单就把参数改一下就可以了. 详见函数loadTimeConfig. 2. 这个程序一直用urllib2给服务器发请求模拟手机操作以查找单子, 所以对滴滴服务器有一定的压力. 如果频率太快, 滴滴能发现. 3. 参数的抓取我用的是Charles, 具体请百度Google之. 4. 程序中的一些参数现在应该还有效, 便于大家试验. 但一段时间后我会使其无效. 运行前, 请把striveOrder(order)注释掉, 不然是有可能出其不意给我抢个单子的 5. 本程序只用于实验研究, 请勿乱用. 谢谢. 三 下面是代码+解释, 可以在上面的链接中下载.程序下载链接 最佳体验所需环境: Python2.6/7, Python3.x没试 手机电脑上都安装坚果云, 并创建ditime2.txt 手机端有邮件接收APP. #!/usr/bin/python # -*- coding: gb2312 -*- ######################################################################### #2015-12-11 09:47:46 #author: [email protected] #使用Python2.6/7 ######################################################################## # 有些库没用, 请自行删除 import urllib2, urllib, traceback, smtplib, datetime import os, sys, time,zlib,json,ConfigParser,codecs from email.mime.text import MIMEText from email.mime.image import MIMEImage import email.MIMEMultipart import email.MIMEText import email.MIMEBase from utility import getPyLogger,debug,info #mail_host="smtp.qq.com" #设置服务器 mail_host='smtp.qq.com' mail_user="[email protected]" #用户名 mail_pass="xxxxxxxxx" #口令, 请修改!!! MORNING_START="08:30" #上班, 截获从8:30到8:40的顺风单 MORNING_END="08:40" AFTERNOON_START="18:05" #下班, 截获从18:05到18:20的顺风单 AFTERNOON_END="18:20" last_modify_time = 0 TOKEN='JPXq-mw6-YPhBnegPQ6pdbwJvXMOw5SnLfWW6-gl1pVUjDsOwkAMRO8ytQvb62wc34Y_FAiJFVW0d2faVCO9N3o7TihAcEZ5WqyLbov3toYKrmQuuKF2jPdAWfRwN9dNMD6_74VKp-B-VA8mrXkSZMvO-pNEuS8e5z8AAP__' # 手机和电脑上都安装坚果云, 创建文本文件ditime2.txt, 在手机上修改参数就可以控制正在电脑上运行的本程序 def loadTimeConfig(): global last_modify_time,MORNING_START,MORNING_END,AFTERNOON_START,AFTERNOON_END file_name = r"C:\ddrive\mynutstore\ditime2.txt" if(not os.path.exists(file_name)): return statinfo=os.stat(file_name) if(statinfo.st_mtime>last_modify_time): last_modify_time = statinfo.st_mtime config = ConfigParser.ConfigParser() try: config.readfp(codecs.open(file_name, "r", "utf_16")) except Exception, e: config.read(file_name) try: MORNING_START=config.get('TIME_INFO', 'MORNING_START').strip() except Exception, e: pass try: MORNING_END=config.get('TIME_INFO', 'MORNING_END').strip() print 'MORNING_END=',MORNING_END except Exception, e: pass try: AFTERNOON_START=config.get('TIME_INFO', 'AFTERNOON_START').strip() except Exception, e: pass try: AFTERNOON_END=config.get('TIME_INFO', 'AFTERNOON_END').strip() except Exception, e: pass def getHtmlContent(respInfo): htmlContent = '' try: respHtml = respInfo.read() if( ("Content-Encoding" in respInfo.headers) and (respInfo.headers['Content-Encoding'] == "gzip")): htmlContent = zlib.decompress(respHtml, 16+zlib.MAX_WBITS); else: htmlContent = respHtml except BaseException, e: debug(logger, traceback.format_exc()) return htmlContent def send_mail(to_list,sub,content): me="[email protected]" msg = MIMEText(content,_subtype='plain',_charset='gb2312') msg['Subject'] = sub msg['From'] = me msg['To'] = ";".join(to_list) try: server = smtplib.SMTP() server.connect(mail_host) server.login(mail_user,mail_pass) server.sendmail(me, to_list, msg.as_string()) server.close() return True except Exception, e: print str(e) return False headers = { 'Host': 'api.didialift.com' ,'Accept-Encoding': 'gzip' ,'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 6.0.1; MI 4LTE MIUI/V7.2.11.0.MXDCNDB)' } common_headers = { 'Host': 'common.diditaxi.com.cn' ,'Accept-Encoding': 'gzip' ,'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 6.0.1; MI 4LTE MIUI/V7.2.11.0.MXDCNDB)' } xiaojukeji_headers = { 'Host': 'pay.xiaojukeji.com' ,'Accept-Encoding': 'gzip, deflate' ,'Accept': '*/*' ,'Accept-Language': 'zh-Hans;q=1, en;q=0.9, fr;q=0.8, de;q=0.7, zh-Hant;q=0.6, ja;q=0.5' ,'User-Agent': 'OneTravel/4.1.4.3 (iPhone; iOS 7.1.2; Scale/2.00)' } ROUTE_ID_MORNING1='12132747' #家->办公室 ROUTE_ID_AFTERNOON1='109950277' #办公室->家 one_way_map = { 'android_id':'2227d1a93826902' ,'appversion':'4.4.10' ,'at_mb_cid':'19771395' ,'at_mb_lac':'16836' ,'at_mb_mcc':'460' ,'at_mb_mnc':'01' ,'at_net_st':'1' ,'at_wf_bssid':'8c:be:be:16:b5:74' ,'at_wf_ssid':'"zzzzzz"' ,'channel':'0' ,'city_id':'14' ,'cpu':'Processor : ARMv8 Processor rev 1 (v8l)' ,'datatype':'1' ,'date_id':'1477584000' ,'dviceid':'bf39e245983e7ce8b96ec5cb468f4b9e' ,'filter':'0' ,'imei':'8659310207085419EFC357283F3AFD66688CC444C08403A' ################ ,'lat':'38.844252869870736' ,'lng':'121.51104529558397' ,'locatePerm':'1' ,'locateTime':'1462240824' ,'mac':'74:51:ba:55:a6:8f' ,'maptype':'soso' ,'model':'MI 4LTE' ,'networkType':'WIFI' ,'os':'6.0.1' ,'route_id':'12132747' #,'sig':'2cdde9c6ac1b653c19a31a535b1959acf0c61156' ,'suuid':'F759479A0C2CCDE83BE5EA8D5F6EC05E_15' ,'token':TOKEN ,'uuid':'D85C052433285BB365875F9F3AA28EFE'############### ,'vcode':'162' ,'wsgsig':'sign error' } #抢单参数 strive_para_map = { 'android_id':'2227d1a93826902' #'_t':'1449818404' ,'appversion':'4.4.10' ,'at_mb_cid':'18589187' ,'at_mb_lac':'16838' ,'at_mb_mcc':'460' ,'at_mb_mnc':'01' ,'at_net_st':'1' ,'at_wf_bssid':'8c:be:be:16:b5:74' ,'at_wf_ssid':'zzzzzz' ,'channel':'0' ,'city_id':'14' ,'cpu':'Processor : ARMv8 Processor rev 1 (v8l)' ,'datatype':'1' ,'dviceid':'bf39e245983e7ce8b96ec5cb468f4b9e' ,'imei':'8659310207085419EFC357283F3AFD66688CC444C08403A' ,'lat':'38.849033' ,'lng':'121.518660' ,'locatePerm':'1' ,'locateTime':'1449818399' ,'mac':'74:51:ba:55:a6:8f' ,'maptype':'soso' ,'model':'MI 4LTE' ,'networkType':'WIFI' ,'order_id':'3635506508184237070' ,'order_level':'1' ,'os':'6.0.1' ,'route_id':'4338899913' ,'serial':'1462283172995' #,'sig':'82d12c28338ca223876af1242cf341e6a334cc50' ,'source':'0' ,'suuid':'F759479A0C2CCDE83BE5EA8D5F6EC05E_15' ,'token':TOKEN ,'uuid':'D85C052433285BB365875F9F3AA28EFE' ,'vcode':'162' ,'view_sort':'0c' } # 此函数用来计算sig - 用来加入请求参数中. 这个SIG参数一般是APP用来防止你通过模拟作弊的. def getSig(map): from operator import itemgetter params = sorted(map.iteritems(), key=itemgetter(0), reverse=False) newList = [] PREFIX = "didiwuxiankejiyouxian2013" newList.append(PREFIX) for parm in params: newList.append(parm[0]+parm[1]) newList.append(PREFIX) data = ''.join(newList) import hashlib sig = hashlib.sha1(data).hexdigest(); return sig POINT_HOME = set([u'万科溪之谷',u'依云溪谷']) POINT_OFFICE = set([u'大连软件园腾飞',u'腾飞软件园',u'谷歌里',u'东软软件园B区']) #挑选合适的单子,条件包括: # a. 起点终点在POINT_HOME和POINT_OFFICE中; # b. 时间在[MORNING_START,MORNING_END], 或[AFTERNOON_START,AFTERNOON_END] def filter(order): departure_time = order["trip_info"]['text_setup_time'] #route_id = order['route_id'] order_id = order["order_info"]['order_id'] from_name = order["trip_info"]['from_name'] from_address = order["trip_info"]['from_address'] to_name = order["trip_info"]['to_name'] to_address = order["trip_info"]['to_address'] price = order["trip_info"]['price'] global MORNING_START,MORNING_END,AFTERNOON_START,AFTERNOON_END #上班 if(departure_time[-5:]>=MORNING_START and departure_time[-5:]-1: start = True; break; if(start == False): return False; #测试终点 end = False; for oneArea in POINT_OFFICE: if to_name.find(oneArea)>-1: end = True; break; return end; #下班 if(departure_time[-5:]>=AFTERNOON_START and departure_time[-5:]-1: start = True; break; if(start == False): return False; #测试终点 end = False; for oneArea in POINT_HOME: if to_name.find(oneArea)>-1: end = True; break; return end; return False; #其它一律视为不符合条件 HOME_at_wf_bssid = 'ec:88:8f:2b:a1:84' HOME_at_wf_ssid = '"MERCURY_2BA184"' HOME_lat='38.814874403212' HOME_lng='121.577924262153' HOME_at_mb_cid='68630454' HOME_at_mb_lac='49441' # OFFICE_at_wf_bssid = '8c:be:be:16:b5:74' OFFICE_at_wf_ssid = '"zzzzzz"' OFFICE_lat='38.949033203125' OFFICE_lng='121.418660753038' OFFICE_at_mb_cid='18538497' OFFICE_at_mb_lac='16836' #修改参数 def updateParmsMap(map): localtime = time.localtime(time.time()) hour = str(localtime.tm_hour) min = str(localtime.tm_min) if(len(hour)==1): hour='0'+hour if(len(min)==1): min='0'+min hm = hour+':'+min if( hm>'09:00' and hm=10 and hour |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |