最近一直在研究这个,希望能用微博引流,话不多说
# /usr/bin/env python
# -*- coding:utf-8 -*-
import threading
from urllib import request, parse
from bs4 import BeautifulSoup
import http.cookiejar
import json
import random
import time
import configparser
import re
import math
import os
import traceback
import requests
from requests_toolbelt import MultipartEncoderMonitor
from MySqlInter import MySqlInter
'''
构建公共请求头
'''
# 登录
def login(code=0):
login_url = 'https://passport.weibo.cn/sso/login'
# 构造登录参数
params = {
'username': username,
'password': password,
'savestate': '1',
'r': '',
'ec': '0',
'pagerefer': '',
'entry': 'mweibo',
'wentry': '',
'loginfrom': '',
'client_id': '',
'code': '',
'qq': '',
'mainpageflag': '1',
'hff': '',
'hfp': ''
}
params = parse.urlencode(params).encode('utf-8')
req = request.Request(login_url, params, method="POST")
res = request.urlopen(req)
result = res.read().decode('utf-8')
login_result = json.loads(result)
if login_result['msg'] == '':
print('登陆成功')
return True
else:
print(login_result['msg'])
return False
# 上传文件
def upload_pic(str, path):
try:
name = path.split('/')[-1]
m = MultipartEncoderMonitor.from_fields(
fields={'type': 'json',
'pic': (name, open(path, 'rb'), "application/octet-stream"),
'st': str
},
)
# 'cookie': "XSRF-TOKEN=1093d3;MLOGIN=1;SCF=AiDo0hUv7kdmNPD80v_FXfJF-G23i1xPrSs0dgYxnL8lg9pa22w6Ujb59CVuCAiuQNiFzikHGNhBng4vHGpu7MU.;SSOLoginState=1578974457;SUB=_2A25zGUypDeRhGeFN7VsV9CzOzz-IHXVQ4lThrDV6PUJbkdANLXj5kW1NQ_2LYBpJCyz6DjFtfia1vTqvwsOUmrO-;SUHB=08Jrg82rI3lBH9;WEIBOCN_FROM=1110003030;_T_WM=56807055301;login=9de37c72b9f15cd57c8d7fdf3f6fb3c9",
headers = {
'referer': 'https://m.weibo.cn/compose/?pids=',
'Content-Type': m.content_type,
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
r = requests.post('https://m.weibo.cn/api/statuses/uploadPic', data=m, headers=headers, cookies=cookie).json()
print(r)
pic_id = r['pic_id']
return pic_id
except:
traceback.print_exc()
# 发微博
def post_weibo(str, content, picIds):
add_weibo_url = 'https://m.weibo.cn/api/statuses/update'
# 构造登录参数
params = {
'content': content,
'st': str,
'picId': picIds
}
params = parse.urlencode(params).encode('utf-8')
req = request.Request(add_weibo_url, params, method="POST")
res = request.urlopen(req)
html = res.read().decode('utf-8')
print(html)
def down_pic(url):
path = "img/"
split = url.split("/")
file_name = path + split[len(split) - 1]
try:
# print("缓存图片中-> " + url + "\n" + "保存至-> " + path)
r = requests.get(url)
file_size = r.headers["Content-Length"]
with open(file_name, 'wb') as f:
f.write(r.content)
f.close()
except:
traceback.print_exc()
return file_name
def auto_post():
try:
sql = MySqlInter(db_config)
build_opener()
is_login = login()
if is_login:
str = get_st()
row = sql.get_available_weibo(3051943081)
print(row)
id = row[0]
content = row[4]
pics = row[7]
pic_ids = ""
if pics != "":
pic_list = pics.split(",")
for pic in pic_list:
file_name = down_pic(pic)
pic_id = upload_pic(str, file_name)
pic_ids += pic_id + ","
post_weibo(str, content, pic_ids[0: len(pic_ids) - 1])
sql.update_weibo_state(int(id))
except:
print("此处发图任务失败!")
timer = threading.Timer(7200, auto_post)
timer.start()
if __name__ == '__main__':
auto_post()