上次分享过一个自动采集入库的脚本(phpcms的),有童鞋建议改为表单提交形式,毕竟数据库入库代码改动成本比较高,而通过表单post数据只 需改下cookie和频道id就可以运行起来。所以,这次主要利用pycurl模块和fiddler抓包工具演示下dedecms是如何提交数据的。
尝试过dedecms post数据的童鞋可能已经发现,织梦post的数据跟一般数据有些不同,dedecms post数据格式是multipart,利用抓包工具你会发现这样一串东西:Content-Type: multipart/form-data; boundary=---------------------------249724317605,如:
那么具体该如何提交呢?主要有两点(post地址、cookie、频道id之类的问题自己解决):
1,headers增加Content-Type: multipart/form-data,如下图:
2,通过fiddler把提交的数据下载到本地(点击下图红框另存到到本地,编码不需更改),命名为data.txt.
data = open('data.txt').read(),data直接作为post表单的数据即可。
实际上到此为止,你已经能够成功提交了,是不是很简单。
实际使用中,我们总不能把要更新的文章标题和内容写到txt里,如何把title、content等变成变量?一行代码即可搞定:
data = data.replace('title@123456',title).replace('content@123456',content)
只要把data.txt文章标题的文字改为'title@123456',内容改为'content@123456',然后把他们替换掉即可。下面是完整代码地址:
# coding:utf-8
import pycurl,StringIO
import sys
reload(sys)
sys.setdefaultencoding('utf8')
headers = [
"User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36",
"Cookie:PHPSESSID=a8p9lr4jksj5kh9k3nhjaa5pu7; DedeUserID=1; DedeUserID__ckMd5=0023ecbe319d14d9; DedeLoginTime=1470919547; DedeLoginTime__ckMd5=b05a3b1e5c4bce22",
"Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryS1tN0Ueh3In2YSN8",
]
def curl(url):
c = pycurl.Curl()
c.setopt(pycurl.REFERER, 'http://yourdomain.com/dede/article_add.php?channelid=1')
c.setopt(pycurl.FOLLOWLOCATION, True)
c.setopt(pycurl.MAXREDIRS,5)
c.setopt(pycurl.CONNECTTIMEOUT, 60)
c.setopt(pycurl.TIMEOUT,120)
c.setopt(pycurl.ENCODING, 'gzip,deflate')
# c.setopt(c.PROXY,ip)
c.fp = StringIO.StringIO()
c.setopt(pycurl.URL, url)
c.setopt(pycurl.HTTPHEADER,headers)
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.POSTFIELDS, data)
c.setopt(c.WRITEFUNCTION, c.fp.write)
c.perform()
code = c.getinfo(c.HTTP_CODE)#返回状态码
html = c.fp.getvalue()#返回源代码
return html
title = 'ITSEO培训怎么样'.encode('gbk','ignore')
content = 'TSEO讲师 多年excel实战经验任职某通讯公司seo岗位,长期接触各类... 关注 私信 夜息 ITSEO创始人 ITSEO创始人,原途牛seo负责人。SEO顾问服务过多个行...'.encode('gbk','ignore')
data = open('data.txt').read()
data = data.replace('title@123456',title).replace('content@123456',content)
print curl('http://yourdomain.com/dede/article_add.php')