Repository navigation
Expand file tree
/
Copy pathservice.py
More file actions
executable file
·179 lines (164 loc) · 5.99 KB
/
Copy pathservice.py
File metadata and controls
executable file
·179 lines (164 loc) · 5.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
import requests, os, json, re, time
import helper, cache
# 基类
class App(object):
def __init__(self):
# utl客户端
self.__session = requests.Session()
# 用户信息
self.__user = None
# 初始化登录
self.__login()
# 当前第几页
self.page = 0
# 已成功发送多少条
self.success_num = 0
# 本次要发送成功的条数
self.newsNum = int(helper.common.getConfig('send', 'newsNum'))
# 是否跳过曾经发送过评论的帖子
self.isDistinct = helper.common.getConfig('send', 'isDistinct')
# 记录发送url缓存key名称
self.successKey = helper.common.getConfig('send', 'successKey')
# 要发送的内容
self.content = helper.common.getConfig('send', 'content')
# 延迟发送时间
self.sleepSend = int(helper.common.getConfig('send', 'sleepSend'))
# 登录 is_reload 强制重新登录
def __login(self):
# 已登录
if not self.__user is None:
return self.__user
# 有session记录 直接自动登录
if not self.__session.cookies:
# 打开session文件
with open('session', 'rt') as file:
cookie = file.read()
if cookie:
dic = json.loads(cookie)
for item in dic:
self.__session.cookies.set(item, dic[item])
self.__get_user()
# 获取用户信息成功
if not self.__user is None:
return
# 重新登录
# 请求体数据
posts = {
'userName': helper.common.getConfig('user', 'userName'),
'loginPassword': helper.common.getConfig('user', 'password'),
'persistent': 'true',
'showCode': 'false',
}
self.__session = requests.Session()
# 登录成功后 cookie自动记录
res = self.__session.post(helper.common.getConfig('url', 'loginUrl'), posts)
if res.json()['Message'] != 'ok':
print("登录失败")
print(res.json())
os._exit(0)
# 登录成功 记录session 防止重复登录
cookie = self.__session.cookies.get_dict()
with open('session', 'wt') as file:
file.write(json.dumps(cookie))
# 获取用户信息
self.__get_user()
# 获取用户信息成功
if not self.__user is None:
return
else:
print("登录失败!")
os._exit(0)
def __get_user(self):
res = self.__session.get(helper.common.getConfig('url', 'userInfo'))
json_str = res.content.decode('utf-8')[1:-2]
if json_str == '""':
self.__user = None
return
self.__user = json.loads(json_str)
def get_user_info(self):
return self.__user
def get_client(self):
return self.__session
def run(self):
'''
主运行进程方法
:return:
'''
self._run(1)
def _run(self, page=1):
lists = self.__get_news_list(page)
for item in lists:
self.send_comment(item)
if self.success_num >= self.newsNum:
# 数量已够 结束
print('已成功发送 %s 条评论!' % (self.success_num))
return
# 延迟10秒后再发送 防止太快封号
time.sleep(self.sleepSend)
if self.success_num < self.newsNum:
self._run(page + 1)
def __get_news_list(self, page=-1):
'''
每次取一页
:param page:
:return:
'''
if page == -1:
page = self.page + 1
url = helper.common.getConfig('url', 'getNewsList')
response = self.__session.get(url, data={"page": page,
"jsondata": '{"type":"updatenodelabel","isCache":true,"cacheTime":60,"nodeId":"11007","isNodeId":"true"}'}).content.decode(
'utf-8')
if not response:
print('获取新闻列表失败!')
return []
# 正则匹配链接
pa = re.compile(r'http:\/\/[a-z\.]{10,30}\/[a-z]{3,15}\/\d{6}\/\d{7}\.shtml')
# 用set存储 取出重复
lists = set(pa.findall(response))
if not lists:
print('获取新闻第 %s 页列表失败' % (page))
return lists
def send_comment(self, url):
'''
发表评论
:return:
'''
# 截取url中帖子id
news_id = re.search('(\d{7}).shtml', url).group(1)
if not news_id:
print('获取新闻id失败!')
return
# 判断跳过重复
if self.isDistinct == '1' and self.check_is_send(news_id):
print("重复的文章:", url)
return
posts = {
'jsondata': '{"sid":' + news_id + ',"content":"' + self.content + '"}'
}
href = helper.common.getConfig('url', 'addComment')
res = self.__session.post(href, posts)
json_str = res.json()
if json_str["status"] == 'ok':
self.add_news_log(news_id, url)
self.success_num = self.success_num + 1
print('第 %s 条评论发送成功:%s' % (self.success_num, url))
else:
print(json_str)
def check_is_send(self, news_id):
'''
判断帖子id是否曾经发送过评论
:return:
'''
res = cache.cache.hget(self.successKey, news_id)
if res:
return True
else:
return False
def add_news_log(self, news_id, url):
'''
记录帖子已经发送 防止重复发送
:return:
'''
cache.cache.hset(self.successKey, news_id, url)
app = App()