python实现雅虎拍卖后台自动回复卖家消息
前些时间,公司让做一个自动回复卖家信息的程序,现在总结下(用python实现的)
1.登陆雅虎拍卖后台手动获取cookie文件
#coding=utf-8
import sqlite3
import cookielib
from cStringIO import StringIO
def sqlite2cookieChrome(filename):
con = sqlite3.connect(filename)
con.text_factory = str
cur = con.cursor()
cur.execute("select host_key, path, secure, expires_utc, name, value from cookies")
ftstr = ["FALSE","TRUE"]
s = StringIO()
s.write(
"""# Netscape HTTP Cookie File
# http://www.netscape.com/newsref/std/cookie_spec.html
# This is a generated file! Do not edit.\n""")
for item in cur.fetchall():
try:
s.write("%s\t%s\t%s\t%s\t%s\t%s\t%s\n" % (
item[0], ftstr[item[0].startswith('.')], item[1],
ftstr[item[2]], item[3], item[4], item[5]))
except UnicodeError:
continue
s.seek(0)
return s.read()
cookie_jar = cookielib.MozillaCookieJar()
cookie_jar._really_load(s, '', True, True)
return cookie_jar
yahoo_id = raw_input("please input yahoo id: ").strip()
cookie_jar = sqlite2cookieChrome('C:\Documents and Settings\Administrator\Local Settings\Application Data\Google\Chrome\User Data\Default\cookies') #windows xp
open('./%s.txt' % yahoo_id, 'w').write(cookie_jar)
2.回复卖家信息
主要实现代码:
# auction_url: http://page10.auctions.yahoo.co.jp/jp/auction/m114547886
# subject: 评论类型
# comment_content:评论内容
# cookie_jar: cookie
def post_yahoo_auction_comment(auction_url, subject, comment_content, cookie_jar):
try:
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie_jar))
opener.addheaders = [("User-Agent", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11")]
#-------------------------------抓取取引的链接--------------------------------------#
html = opener.open(auction_url).read()
write_file('thefile1.html',html,'w');
soup = BeautifulSoup(html)
url = soup.find("a", text="取引ナビ")['href']
#新版的yahoo页面
if(url[0:15] == 'https://contact'):
#-------------------------------抓提交的标单隐藏域--------------------------------------#
html = opener.open(url).read()
write_file('thefile2.html',html,'w');
soup = BeautifulSoup(html)
aid = soup.find("input", attrs={"name":"aid"})['value']
bid = soup.find("input", attrs={"name":"bid"})['value']
syid = soup.find("input", attrs={"name":"syid"})['value']
oid = soup.find("input", attrs={"name":"oid"})['value']
crumb = soup.find("input", attrs={"name":".crumb"})['value']
#-------------------------------初次提交标单--------------------------------------#
comment_content = comment_content.encode("utf-8", "ignore")
post_param = urllib.urlencode({
"aid" :aid,
"syid":syid,
"bid":bid,
"oid":oid,
"body" :comment_content,
".crumb":crumb,
"subject" : subject
})
html = opener.open("https://contact.auctions.yahoo.co.jp/preview", post_param).read()
write_file('thefile3.html',html,'w');
soup = BeautifulSoup(html)
crumb = soup.find("input", attrs={"name":".crumb"})['value']
#-------------------------------确认提交标单--------------------------------------#
confirm_param = urllib.urlencode({
".crumb" : crumb,
"aid" : aid,
"syid" : syid,
"bid" : bid,
"oid" : oid,
"subject" : subject,
"body" : comment_content
})
html = opener.open("https://contact.auctions.yahoo.co.jp/send", confirm_param).read()
write_file('thefile4.html',html,'w');
return True
else:
#旧版的雅虎页面
comment_content = comment_content.encode("EUC_JP", "ignore")
page_number = auction_url.split('.')[0].replace("http://", "").replace('page', '')
item_id = auction_url.split('/')[-1]
post_param = urllib.urlencode({
"aID" : item_id,
"subject" : subject,
"comment" : comment_content
})
html = opener.open("http://pageinfo%s.auctions.yahoo.co.jp/jp/show/contact_preview#message"%page_number, post_param).read()
write_file('thefile2.html',html,'w');
soup = BeautifulSoup(html)
crumb = soup.find("input", attrs={"name":".crumb"})['value']
target = soup.find("input", attrs={"name":"target"})['value']
confirm_param = urllib.urlencode({
".crumb" : crumb,
"aID" : item_id,
"subject" : subject,
"comment" : comment_content,
"target" : target,
})
html = opener.open("http://edit%s.auctions.yahoo.co.jp/jp/config/contact_submit"%page_number, confirm_param).read()
return True
except Exception as e:
print e
") == -1:
return -1
else:
return -2
3.雅虎后台自动评论
主要代码:
def post_yahoo_auction_comment(auction_url,item_id, seller,cookie_jar):
try:
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie_jar))
opener.addheaders = [('User-Agent', 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11')]
page_number = auction_url.split('.')[0].replace('http://', '').replace('page', '')
url = 'http://edit'+page_number+'.auctions.yahoo.co.jp/jp/config/leavefeedback?t='+seller+'&nr=1&aID='+item_id
#抓取表单提交页面
html = opener.open(url).read()
write_file('thefile1.html',html,'w')
findstr = '前回、評価した内容'
findstr = findstr.encode("utf-8", "ignore")
if html.find(findstr) > -1:
return 2
rating = 5
comment = '今回ありがとうございます!早速の発送ので取引ができます! 今後もよろしくお願いします!!こちらの評価もお願いします。^_^ '
comment = comment.encode("EUC_JP", "ignore")
soup= BeautifulSoup(html, from_encoding="EUC_JP") #要指定编码,不然会出现编码错误
aID = soup.find('input', attrs={'name':'aID'})['value']
author = soup.find('input', attrs={'name':'author'})['value']
c_comment = soup.find('input', attrs={'name':'c_comment'})['value']
c_date = soup.find('input', attrs={'name':'c_date'})['value']
cacheid = soup.find('input', attrs={'name':'cacheid'})['value']
catid = soup.find('input', attrs={'name':'catid'})['value']
curprice = soup.find('input', attrs={'name':'curprice'})['value']
endtime = soup.find('input', attrs={'name':'endtime'})['value']
isBidByDocomo = soup.find('input', attrs={'name':'isBidByDocomo'})['value']
isIntlAuction = soup.find('input', attrs={'name':'isIntlAuction'})['value']
isIntlTarget = soup.find('input', attrs={'name':'isIntlTarget'})['value']
isIntlUser = soup.find('input', attrs={'name':'isIntlUser'})['value']
isResponse = soup.find('input', attrs={'name':'isResponse'})['value']
isRevision = soup.find('input', attrs={'name':'isRevision'})['value']
logininwinnerslist = soup.find('input', attrs={'name':'logininwinnerslist'})['value']
preview = soup.find('input', attrs={'name':'preview'})['value']
r_comment = soup.find('input', attrs={'name':'r_comment'})['value']
r_date = soup.find('input', attrs={'name':'r_date'})['value']
r_id = soup.find('input', attrs={'name':'r_id'})['value']
r_rating = soup.find('input', attrs={'name':'r_rating'})['value']
role = soup.find('input', attrs={'name':'role'})['value']
starttime = soup.find('input', attrs={'name':'starttime'})['value']
t = soup.find('input', attrs={'name':'t'})['value']
target = soup.find('input', attrs={'name':'target'})['value']
targetinwinnerslist = soup.find('input', attrs={'name':'targetinwinnerslist'})['value']
u = soup.find('input', attrs={'name':'u'})['value']
UEtitle = soup.find('input', attrs={'name':'UEtitle'})['value']
wc = soup.find('input', attrs={'name':'wc'})['value']
write = soup.find('input', attrs={'name':'write'})['value']
post_param = urllib.urlencode({
'aID':aID,
'author':author,
'c_comment':c_comment,
'c_date':c_date,
'cacheid':cacheid,
'catid':catid,
'comment':comment,
'curprice':curprice,
'endtime':endtime,
'isBidByDocomo':isBidByDocomo,
'isIntlAuction':isIntlAuction,
'isIntlTarget':isIntlTarget,
'isIntlUser':isIntlUser,
'isResponse':isResponse,
'isRevision':isRevision,
'logininwinnerslist':logininwinnerslist,
'preview':preview,
'r_comment':r_comment,
'r_date':r_date,
'r_id':r_id,
'r_rating':r_rating,
'rating':rating,
'role':role,
'starttime':starttime,
't' :t,
'target':target,
'targetinwinnerslist':targetinwinnerslist,
'u':u,
'UEtitle':UEtitle,
'wc':wc,
'write' :write,
})
#抓取确认提交后的页面
html = opener.open('http://redit.auctions.yahoo.co.jp/jp/rconfig/leavefeedback', post_param).read()
write_file('thefile2.html',html,'w');
soup= BeautifulSoup(html, from_encoding="EUC_JP")
post_param = urllib.urlencode({
'aID':aID,
'author':author,
'c_comment':c_comment,
'c_date':c_date,
'cacheid':cacheid,
'catid':catid,
'comment':comment,
'curprice':curprice,
'endtime':endtime,
'isBuyer':soup.find('input', attrs={'name':'isBuyer'})['value'],
'isBidByDocomo':isBidByDocomo,
'isIntlAuction':isIntlAuction,
'isIntlTarget':isIntlTarget,
'isIntlUser':isIntlUser,
'isResponse':isResponse,
'isRevision':isRevision,
'isSeller':soup.find('input', attrs={'name':'isSeller'})['value'],
'logininwinnerslist':logininwinnerslist,
'own':soup.find('input', attrs={'name':'own'})['value'],
'preview':soup.find('input', attrs={'name':'preview'})['value'],
'r_comment':r_comment,
'r_date':r_date,
'r_id':r_id,
'r_rating':soup.find('input', attrs={'name':'r_rating'})['value'],
'rating':rating,
'role':role,
'starttime':starttime,
't' :t,
'target':target,
'targetinwinnerslist':targetinwinnerslist,
'u':u,
'UEtitle':UEtitle,
'wc':wc,
'write' :soup.find('input', attrs={'name':'write'})['value'],
})
html = opener.open('http://redit.auctions.yahoo.co.jp/jp/rconfig/leavefeedback', post_param).read()
write_file('thefile3.html',html,'w');
return True
except Exception as e:
print e
') == -1:
return -1
else:
return -2
代码说明:其实自动回复卖家信息并不难,主要是抓取页面表单数据,并将数据提交到另一个页面。函数的auction_url, comment_content, seller等参数都是从数据库读的,我在程序用到了ConfigParser库读取配置文件。
python实现如下:
import ConfigParser
def get_db_con():
config = ConfigParser.ConfigParser();
config.read('conf/db.cfg')
host = config.get("mysqllink1","host")
port = config.getint("mysqllink1","port")
user = config.get("mysqllink1","user")
password = config.get("mysqllink1","password")
dbname = config.get("mysqllink1","dbname")
charset = config.get("mysqllink1","charset")
return [host,port,user,password,dbname,charset]
def get_bid_item_from_db():
link = get_db_con()
conn = MySQLdb.connect(host=link[0], port=link[1], user=link[2], passwd=link[3], db=link[4], charset=link[5], cursorclass=MySQLdb.cursors.DictCursor)
cursor = conn.cursor()
config = ConfigParser.ConfigParser();
config.read('conf/db.cfg')
limit = config.get("selpar","limit")
limit = '' if limit=='All' else ' limit '+limit
query = "SELECT a.*, b.seller, b.is_send_mail FROM bid_item a JOIN bid_win b ON a.bid = b.bid JOIN biogg_auction_data bd ON bd.AuctionId = a.item_id WHERE ( to_days(now()) - to_days(b.win_date) = 1 OR to_days(now()) = to_days(b.win_date)) AND a.is_store<>1 AND b.is_send_mail <= 0"+limit
cursor.execute(query)
bid_items = cursor.fetchall()
cursor.close()
conn.close()
return bid_items
db.cfg:
[mysqllink1] host=localhost user=root password=pwd port=3306 dbname=test charset=utf8 [selpar] limit=All
其中还用到BeautifulSoup库,链接:http://www.crummy.com/software/BeautifulSoup/bs4/doc/
python实现雅虎拍卖后台自动回复卖家消息的更多相关文章
- python 全栈开发,Day103(微信消息推送,结算中心业务流程)
昨日内容回顾 第一部分:考试题(Python基础) 第二部分:路飞相关 1. 是否遇到bug?难解决的技术点?印象深刻的事? - orm操作费劲 - 最开始学习路由系统时候,匹配规则: 答案一: 有, ...
- python 微信机器人,微信自动回复
使用python现成的模块 itchat,可以实现,微信机器人的自动回复 其内部原理,是模拟了web版微信的登录,然后进行消息的接收发送,并不是只能用python实现,其他后端语言都可以做到 下面是使 ...
- 10分钟教你用Python打造天气机器人+关键字自动回复+定时发送
01 前言 Hello,各位小伙伴.自上次我们介绍了Python实现天气预报的功能以后,那个小程序还有诸多不完善的地方,今天,我们再次来完善一下我们的小程序.比如我们想给机器人发“天气”等关键字,它就 ...
- python web框架Flask——后台登录
项目搭建 创建一个项目之后,需要在手动创建几个包(含有__init__.py文件的目录)和文件 1.在主目录下创建配置文件:config.py 2.在主目录下创建扩展文件:exts.py 3.在主目录 ...
- python程序一直在后台运行的解决办法
刚写了个python程序,要一直在后台运行,即使断开ssh进程也在,下面是解决办法: 假如Python程序为test.py 编写shell脚本start.sh #!/bin/bash python t ...
- DWR实现后台推送消息到web页面
DWR简介 DWR(Direct Web Remoting)可用于实现javascript直接调用java函数和后台直接调用页面javascript代码,后者可用作服务端推送消息到Web前端. (服务 ...
- ASP.net后台弹出消息对话框的方法!【转】
在winform后台,我们通过MessageBox.show(“消息")的方式来返回后台信息,在webform后台,我们通过Response.write(”消息")来返 ...
- python使用pyapns进行ios推送消息
Pyapns 提供了通用的Apple Push Notification Service (APNS).该解决方案使用了开源的Twisted server,支持原生的Python和Ruby API. ...
- python 写的http后台弱口令爆破工具
今天来弄一个后台破解的Python小程序,哈哈,直接上代码吧,都有注释~~ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ...
随机推荐
- int 指令
int n 也就是中断操作->根据中断类型码来查找中断向量表(中断向量表在0-3ffh这个内存空间) 调用int n 也就操作了下面的步骤 1)取中断类型码n: 2)标志寄存器入栈,IF=0,T ...
- CentOS 修改IP地址, DNS, 网关
一.CentOS 修改IP地址 修改对应网卡的IP地址的配置文件# vi /etc/sysconfig/network-scripts/ifcfg-eth0 修改以下内容DEVICE=eth0 #描述 ...
- JS正则表达式验证表单
一.解释一些符号相关的意义 1. /^$/ 这个是个通用的格式. ^ 匹配输入字符串的开始位置:$匹配输入字符串的结束位置 2. 里面输入需要实现的功能. ...
- 牛一网ecshop家电数码模板(仿易迅网)for ecshop 2.7.3
本模板尤其适用于家电数码行业. 本模板已经开发.测试完毕,并开放演示. 本模板支持全站静态.销售数量后台自定义.首页商品独立图片.品牌独立展示.商品精美团购.宽屏窄屏自动识别并切换.分 ...
- 借助Ant工具,实现快速开发
当一个项目大了以后,每次重新编译,打包,运行等就会变得复杂.费时.重复,在c语言中有make脚本进行这些工作的批量完成,那么在java中,我们可以使用Ant. Ant是一个构建工具,可以完成这些任务: ...
- Android开发:TextView真正可控、不需要焦点的水平滚动--这才是真正的跑马灯
网上的TextView做跑马灯,大多都是要用到焦点,而且字数要超出滚动区域宽度才能实现滚动,使用起来十分不方便. 这里实现一种真正可控的滚动 (1)不需要焦点 (2)任意字数 (3)滚动从滚动区域右边 ...
- 标准I/O库之标准输入、标准输出和标准出错
对一个进程预定义了三个流,并且这三个流可以自动地被进程使用,它们是:标准输入.标准输出和标注出错.这些流引用的文件与文件描述符STDIN_FILENO.STDOUT_FILENO和STDERR_FIL ...
- 转:ORACLE制造方法的比较
转自:http://blog.itpub.net/133041/viewspace-438549/ 1.离散制造. 2.重复制造 3.流式制造 Oracle Applications 支持离散.项目. ...
- (转)常用CSS优化总结——网络性能与语法性能建议
原文地址:http://www.cnblogs.com/dolphinX/p/3508657.html 在前端面试中最常见的问题就是页面优化和缓存(貌似也是页面优化),被问了几次后心虚的不行,平然平时 ...
- hibernate篇章六--demo(Hibernate之第1解之-hibernate_demo_1)
准备工作做好了,开始Hibernate: 1:建立包:package:dao.model.service.util包: 2:开始model实体类Student:id,sname生成getter/set ...