python抢货程序_写个Python程序上下班抢个顺风单

#!/usr/bin/python

# -*- coding: gb2312 -*-

#########################################################################

#2015-12-11 09:47:46

#author: 358275018@qq.com

#使用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="358275018@qq.com" #用户名

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="358275018@qq.com"

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:]<=MORNING_END):

#测试起点

start = False;

for oneArea in POINT_HOME:

if from_name.find(oneArea)>-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:]<=AFTERNOON_END):

#测试起点

start = False;

for oneArea in POINT_OFFICE:

if from_name.find(oneArea)>-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

if(map.has_key('at_wf_bssid')): map['at_wf_bssid']=OFFICE_at_wf_bssid

if(map.has_key('at_wf_ssid')): map['at_wf_ssid']=OFFICE_at_wf_ssid

if(map.has_key('lat')): map['lat']=OFFICE_lat

if(map.has_key('lng')): map['lng']=OFFICE_lng

if(map.has_key('at_mb_cid')): map['at_mb_cid']=OFFICE_at_mb_cid

if(map.has_key('at_mb_lac')): map['at_mb_lac']=OFFICE_at_mb_lac

else:#HOME

if(map.has_key('at_wf_bssid')): map['at_wf_bssid']=HOME_at_wf_bssid

if(map.has_key('at_wf_ssid')): map['at_wf_ssid']=HOME_at_wf_ssid

if(map.has_key('lat')): map['lat']=HOME_lat

if(map.has_key('lng')): map['lng']=HOME_lng

if(map.has_key('at_mb_cid')): map['at_mb_cid']=HOME_at_mb_cid

if(map.has_key('at_mb_lac')): map['at_mb_lac']=HOME_at_mb_lac

now = int(time.time())

#map['_t']=str(now)

map['locateTime']=str(now+10)

if(map.has_key('app_time')): map['app_time']=str(now+10)

date_id = int(time.mktime(datetime.date.today().timetuple()))

map['date_id']=str(date_id)

sig = getSig(map)

map['sig']=sig

def getOrdersViaUrl(url):

req = urllib2.Request(url,headers=headers)

respInfo = urllib2.urlopen(req,timeout=15)

html = getHtmlContent(respInfo)

#debug(logger,html)

json_data = json.loads(html)

orders=[]

section_list = []

if(json_data.has_key('section_list')):

section_list=json_data['section_list']

for section in section_list:

type = section["type"]

if(type=="byway_order_info"):

orders = section["list"]

break

return orders

# 获得线路route_id上所有的单子

def getOrders_432():

localtime = time.localtime(time.time())

hour = localtime.tm_hour

if(hour>=10 and hour<=19):

one_way_map['route_id']=ROUTE_ID_AFTERNOON1

updateParmsMap(one_way_map)

paraStr = urllib.urlencode(one_way_map)

url = "http://api.didialift.com/beatles/api/route/driver/info?"+paraStr

orders = getOrdersViaUrl(url)

return orders

else:

one_way_map['route_id']=ROUTE_ID_MORNING1

updateParmsMap(one_way_map)

paraStr = urllib.urlencode(one_way_map)

url = "http://api.didialift.com/beatles/api/route/driver/info?"+paraStr

orders = getOrdersViaUrl(url)

return orders

# 抢单

def striveOrder(order):

route_id = order['route_id']

order_id = order['order_id']

# put time and sig params

updateParmsMap(strive_para_map)

strive_para_map['route_id']=route_id

strive_para_map['order_id']=order_id

sig = getSig(strive_para_map)

strive_para_map['sig']=sig

paraStr = urllib.urlencode(strive_para_map)

url = "http://api.didialift.com/beatles/api/driver/order/strive?"+paraStr

req = urllib2.Request(url,headers=headers)

respInfo = urllib2.urlopen(req,timeout=15)

html = getHtmlContent(respInfo)

#debug(logger,html)

map = json.loads(html)

return map['errno']=='0' and map['errmsg']=='OK'

if __name__ == '__main__':

try:

# 发邮件通知你服务启动了

send_mail(['358275018@qq.com'],'didi catcher starts','didi catcher starts')

except Exception,e:

pass

log_path = os.path.dirname(os.path.realpath(__file__))

if not os.path.exists(log_path):

os.makedirs(log_path)

logger = getPyLogger('didi','debug',os.path.join(log_path,os.path.basename(__file__)+'.log'),'d',1,99999)

debug(logger,'start to work...')

while(1):

try:

#从坚果云中LOAD最新的参数

loadTimeConfig()

debug(logger,'FLOW: get my orders')

orders = getOrders_432()

debug(logger,'FLOW: GOT ================='+str(len(orders))+' ==================orders')

for order in orders: # 所有单子

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']

passenger_id = order['user_info']['user_id']

nick_name = order['user_info']['nick_name']

debug(logger,'FLOW: filter orders')

debug_content = '%s (%s->%s) price=%s'%(departure_time,from_name,to_name,price) #nick_name

debug(logger,debug_content)

if(filter(order)): #过滤单子

debug(logger,'FLOW: strive order')

striveOrder(order) #抢合适的单子

#print 'FOUND **************************************** FOUND'

content = departure_time.encode('utf8')+' '+from_name.encode('utf8')+' '+to_name.encode('utf8')

# 抢到合适的单子, 给自己发邮件.

send_mail(['358275018@qq.com'],content,content)

break;

time.sleep(10)

except Exception,e:

debug(logger,str(e))

time.sleep(10)

# 退出, 发邮件通知.

send_mail(['358275018@qq.com'],'didi chatcher exits','didi chatcher exits')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言 | 语句概述

C语言语句的作用和分类1、9种控制语句if&#xff08;&#xff09;...else.. //条件语句 for&#xff08;&#xff09;... //循环语句 while&#xff08;&#xff09;... //循环语句 do...while&#xff08;&#xff09; //循环语句 continue //结束本次循环语句 break //中止执…

react性能优化方案_React灵敏且性能卓越的Spray + Akka解决方案,以“在Java和Node.js中发挥并发性和性能”...

react性能优化方案在我以前的文章中&#xff0c;我研究了一个虚拟的交易引擎&#xff0c;并将基于Java的阻止解决方案与基于Node.js的非阻止解决方案进行了比较。 在文章的结尾&#xff0c;我写道&#xff1a; 我怀疑随着Node.js的最近成功&#xff0c;越来越多的异步Java库将…

linux 查看日志_干货 | 名企高频考点之谈谈Linux日志查看方式都有哪些

点击蓝字关注我哦以下是本期干货视频视频后还附有文字版本哦▼《名企高频考点-谈谈Linux日志查看方式都有哪些》▼ps&#xff1a;请在WiFi环境下打开&#xff0c;如果有钱任性请随意0.概述在我们面试各大公司的时候&#xff0c;关于Linux往往最容易问到的问题之一就是Linux指令…

vsm java_java – 我尝试使用JAXB将对象编组到xml文件中时,错误为“缺少@XmlRootElement注释”...

我是刚刚开始使用JAXB的人,所有我需要的是将对象写入xml并在某些时候将其读回java这是我的班级&#xff1a;public class VSM implements java.io.Externalizable{ArrayList termList; //Term DictionaryArrayList queryTermList; //Query listArrayList> docLists;ArrayLis…

jvm7 jvm8_自我修复的JVM

jvm7 jvm8这篇帖子是关于一个应用程序的示例&#xff0c;其中解决每个IT问题的第一个解决方案-“您是否尝试过将其关闭并重新打开”-可能适得其反&#xff0c;弊大于利。 我们不需要关闭电源&#xff0c;而是拥有可以自愈的应用程序&#xff1a;它在一开始就失败了&#xff0c…

实例讲解C语言的位运算

C语言位运算有6种&#xff1a; &&#xff0c; | , ^(异或)&#xff0c; <<(左移)&#xff0c;>>(右移)。注意&#xff1a;参与位运算的元素必须是int型或者char型&#xff0c;以补码形式出现。1.按位与&&运算常应用于&#xff1a;迅速清零保留指定位判…

python3解释器执行not 1 and 1_编程语言的分类,python解释器多版本共存.执行python的两种方式,变量,用户与程序交互...

一、编程语言的分类&#xff1f;机器语言&#xff1a;直接使用二进制指令编程&#xff0c;直接操作硬件&#xff0c;必须考虑硬件细节。汇编语言&#xff1a;用简写的英文标识符取代二进制去编写程序&#xff0c;直接操作硬件&#xff0c;必须考虑硬件细节。高级语言&#xff1…

java字节码执行原理_《Java 底层原理》Java 字节码详解

前言我们在开发中会遇到一些Java的执行超出我们的想象&#xff0c;但是又不知道他为什么会这样执行&#xff0c;这个时候我们就需要能够知道他编译后Class文件是什么样子的&#xff0c;并且理解字节码的含义。Java字节码的原理进制class文件就是字节码文件&#xff0c;直接是打…

C语言学习笔记--位运算

这一节主要说的是位运算&#xff0c;计算机中的执行速度&#xff1a;位运算 > 加减 > 乘除 > 求余位运算就是将数字转换成二进制后进行运算&#xff0c;之后再将数字转换成原来的进制与运算&#xff1a;当两个数相与时&#xff0c;只有都为l的时候结果才为1&#xff0…

openshift学习_在OpenShift上将JMS与JBoss A-MQ结合使用。 学习了有关远程客户端和加密的经验。...

openshift学习OpenShift是“红帽开发的开放式混合云应用程序平台”。 它具有不同的风格&#xff0c;对于大多数您想做的事情&#xff0c;最有趣的部分是公共云应用程序开发和托管平台“ OpenShift Online ”。 您可以轻松地尝试一下&#xff0c;因为在云中使用OpenShift Online…

mathtype运行时错误48_在office中无法使用MathType该怎么办?

想必大家都遇到过在office中无法使用MathType的情况&#xff0c;那么遇到这种情况的话大家应该怎么来解决呢&#xff1f;首先这样的现象一般为&#xff1a;word或者ppt中没有mathtype选项&#xff0c;或者选项打开提示文件未找到&#xff1a;MathPage.WLL。错误提示或者甚至运行…

谈谈C语言中的杂项运算符

在C语言中&#xff0c;还有一些重要的运算符&#xff0c;例如&#xff1a;sizeof()、&、* 、 ?: 。我们把上述的这些运算符归为杂项运算符&#xff0c;下面我将详细介绍这些杂项运算符。下面的表格列出了 C 语言支持的所有杂项运算符&#xff1a;运算符解释例子sizeof()返…

java集合的添加方法_深入理解java集合框架之---------Arraylist集合 -----添加方法

Arraylist集合 -----添加方法1、add(E e) 向集合中添加元素/*** 检查数组容量是否够用* param minCapacity*/public void ensureCapacity(int minCapacity){modCount;int oldCapacity elementData.length;if(minCapacity > oldCapacity){Object oldData[] elementData;int…

jenkins java_具有WildFly,Arquillian,Jenkins和OpenShift的Java EE 7部署管道

jenkins java技术提示&#xff03;54展示了如何Arquillianate&#xff08;Arquillianize&#xff1f;&#xff09;一个现有的Java EE项目并在WildFly在已知主机和端口上运行的远程模式下运行这些测试。 技术提示&#xff03;55展示了当WildFly在OpenShift中运行时如何运行这些测…

matplotlib 折线图_漂亮图表也可信手拈来,一文学会用Python绘制堆积折线图

今天咱们还是接着上次的话题&#xff0c;继续和大家聊聊关于Python绘图相关的东东哦&#xff0c;上次已经和大家讨论完了如何给自己所绘制的图表中添加装饰线以及修改装饰线密度的方法&#xff0c;今天呢&#xff0c;咱们再聊点的新的东东哦&#xff0c;还是和大家继续深耕Pyth…

C语言 | 赋值与运算符

本章以鸡兔同笼为例&#xff0c;讲解赋值语句和一些简单的运算符。相关知识点&#xff1a;scanf(" %d " , &i ); 输入函数&#xff0c;表示输入一个整数&#xff08;%d&#xff09;&#xff0c;赋值给 i&#xff08;&i&#xff09;C语言中加法运算符为 减法…

菜鸟学java要多久_菜鸟学java,根本停不下来!

位运算符&: 两个2进制的操作数,同一位数的两个数如果有一个为0结果就为0,两个都为1才是1.| : 两个2进制的操作数,同一位数的两个数如果有一个为1,两个都为0才是0.^ : 两个2进制的操作数,同一位数的两个数如果相同为0,不同为1.位移运算符<< 左移:把第一个二进制的操作…

响应式多级菜单 侧边菜单栏_使用纯HTML和OmniFaces构建动态响应的多级菜单

响应式多级菜单 侧边菜单栏最近&#xff0c;我不得不使用JSF 2.2创建一个响应式多级菜单。 要求&#xff1a;菜单应&#xff1a; 从后端使用动态结构创建 React灵敏&#xff0c;例如对桌面和移动设备友好 有带有导航链接的子菜单项 支持触摸事件 支持键盘辅助功能 PrimeF…

python列表中随机两个_随机化两个列表并在python中维护顺序

随机化两个列表并在python中维护顺序说我有两个简单的清单&#xff0c;a [Spears, "Adele", "NDubz", "Nicole", "Cristina"]b [1,2,3,4,5]len(a) len(b)我想做的是将a和a随机化&#xff0c;但要保持顺序。 因此&#xff0c;类似&a…

C语言中的头文件

头文件是扩展名为 .h 的文件&#xff0c;包含了 C 函数声明和宏定义&#xff0c;被多个源文件中引用共享。有两种类型的头文件&#xff1a;程序员编写的头文件和编译器自带的头文件。在程序中要使用头文件&#xff0c;需要使用 C 预处理指令 #include 来引用它。前面我们已经看…