调用阿里API实现手机号归属地查询
- 1.作者介绍
- 2.号码归属地介绍
- 2.1 什么是手机号码归属地?
- 2.2 为什么需要手机号码归属地?
- 2.3 手机号码归属地查询对个人的运用
- 3.调用阿里API实现手机号归属地查询
- 3.1阿里API调用
- 3.2补充内容
- 3.3完整代码实现
- 3.4输出结果
- 4.问题与分析
- 5.参考连接
1.作者介绍
翟鹏超,男,西安工程大学电子信息学院,2022级研究生
研究方向:输电线路导线覆冰状态监测
电子邮件:zhaipc0710@qq.com
张思怡,女,西安工程大学电子信息学院,2022级研究生,张宏伟人工智能课题组
研究方向:机器视觉与人工智能
电子邮件:981664791@qq.com
2.号码归属地介绍
2.1 什么是手机号码归属地?
我国的手机号码为11位,前3位是区分运营商的移动接入码,中国的移动接入码都是以1开头的,比如131、139、138等等,这个移动接入码是由运营商向工信部申请,由工信部统一颁发的,每颁发一次,都会发布一个《电信网号码资源使用证书》。第4-7位为地区编码,地区编码4位会对应到号码的初始归属地,这个归属地是对应到城市的,来电归属地就靠他了。一个城市是有多个归属地号码的,一个移动接入码下一共有1万种组合,也就是1万个归属地号码分配给中国的城市,这个号码归属地是由运营商自己管理的。第8-11位为用户号码,某个地区用户的唯一标识。
手机号码的归属地是由手机号的前七位决定的。当你用手机接听电话时,基本都会显示手机号码来自哪个地方,而这个地方也就是号码归属地,归属地的单位是市。当你的号码离开你号码所在的那个市,准确地说是离开电信公司在各个市所划分的网络区域时,这就形成漫游。
2.2 为什么需要手机号码归属地?
在2022年8月19日,工业和信息化部举行“新时代工业和信息化发展”系列新闻发布会第二场“打通经济社会信息大动脉”新闻发布会。工信部网络安全管理局一级巡视员周少清介绍,2021年以来累计拦截涉诈电话25.4亿次、涉诈短信30.5亿条。
常见的十大高发诈骗类型:
诈骗的形式虽然各不相同,但是核心离不开手机号码,而手机号码归属地是一个非常实用的工具,通过号码归属地起到第一判断的作用。
2.3 手机号码归属地查询对个人的运用
在手机号码整个使用群体中个人占比高达90%,使用人数大、占比高的特点也造成了电话诈骗的高频发生。在诈骗高发之时,手机号码归属地作为一个通讯衍生的工具,可以第一时间发挥其作用,在接到不明来电时可以通过手机号码归属地起到判断来电的作用。
运用一:判断号码是否真实
手机号码归属地查询可以帮我们在电话打进来的时候先初步判断是否是真实号码,减少陷入手机电话诈骗的现象。
运用二:对骚扰电话进行标记
手机号码归属地还可以对打过的骚扰电话手机号进行查询标记,这样下次看到就可以直接进行挂断、拉黑了,也可以把它进一步加入手机黑名单。
3.调用阿里API实现手机号归属地查询
3.1阿里API调用
注册并登录阿里云账号:
选择左上角“云市场”->“API”模块:
搜索框输入“号码归属地查询”,点击查看详情:
选择相应套餐,并“立即购买”:
购买成功后进入控制台资源管理界面,从中可以获取个人应用模块的API Key和Secret Key:
3.2补充内容
AppKey和AppCode的区别:
AppKey就像是员工卡一样,用于标识一个应用程序,是应用程序与API服务之间进行安全认证的唯一密钥。对应到公司大楼中,它就相当于员工卡,可以证明你是这个公司的员工。
AppCode就像是门禁密码一样,用于验证应用程序是否被API服务授权。如果应用程序获得了有效的AppKey,并使用该AppKey向API服务发起请求,API服务会在返回结果时将AppCode一并返回给应用程序,应用程序需要在后续的请求中带上AppCode来验证自己是否被API服务授权。对应到公司大楼中,它相当于门禁密码,可以验证员工是否有权进入某些特定区域。
因此,AppKey和AppCode都是API服务安全认证机制的一部分,它们都是为了保证API服务的安全性和可靠性。
3.3完整代码实现
在代码的指定位置填入您的AppCode、要查询的电话号码,然后运行代码。
代码实现:
# 导入需要使用的模块
import urllib.request # 用于发送HTTP请求
import ssl # 用于忽略SSL证书验证
# API请求相关信息
host = 'https://api04.aliyun.venuscn.com' # API请求地址
path = '/mobile' # API请求路径
method = 'GET' # API请求方法
appcode = '你的AppCode' # 阿里云颁发给我们的AppCode,用于身份认证
querys = 'mobile=18138434699' # 查询参数,即要查询的手机号码
bodys = {} # 请求体参数,这里为空,因为是GET请求
url = host + path + '?' + querys # API请求的完整URL
# 构建API请求对象
request = urllib.request.Request(url) # 创建API请求对象
request.add_header('Authorization', 'APPCODE ' + appcode) # 添加Authorization请求头
# 忽略证书错误
ctx = ssl.create_default_context() # 创建默认的SSL上下文
ctx.check_hostname = False # 不检查主机名
ctx.verify_mode = ssl.CERT_NONE # 不验证SSL证书
# 发送API请求并读取响应内容
response = urllib.request.urlopen(request, context=ctx) # 发送API请求,并忽略SSL证书验证
content = response.read() # 读取响应内容
# 打印查询结果
if (content):
print(content.decode('UTF-8')) # 将响应内容从二进制字符串解码成Unicode字符串,并输出到控制台
3.4输出结果
这段输出的具体信息如下:
网络访问编号(num): 1813843
运营商(isp): 电信
省份(prov): 广东
城市(city): 深圳
网络类型(types): 中国电信
城市代码(city_code): 0755
区域代码(area_code): 440300
邮政编码(zip_code): 518000
经度(lng): 114.057868
纬度(lat): 22.543099
ret和msg表示返回的状态和消息,log_id是日志编号。
4.问题与分析
(1)
问题: ModuleNotFoundError: No module named ‘urllib2’
原因: 主要问题出现在Python版本,使用的是3版本,写的代码是2版本格式, python 3.x 以上的版本 urllib和urllib2 已经被集合到一个包里 urllib 中
解决方法: import urllib2改为import urllib.request
urllib2.Request(url)改为 urllib.request.Request(url)
urllib2.urlopen(request, context=ctx)改为urllib.request.urlopen(request, context=ctx)
(2)
问题: 输出为二进制字符串形式,不易读
原因: 主要问题出现在输出结果时,未将二进制字符串转换为unicode字符串
解决方法:要将二进制字符串转换成字符串,可以使用decode()方法进行解码
print(content) 改为 print(content.decode(‘utf-8’))
5.参考连接
一文带你看透手机号码归属地-阿里云开发者社区. [https://developer.aliyun.com/article/1134920?spm=a2c6h.12873639.article-detail.22.61e562eai8rX31&scm=20140722.ID_community@@article@@1134920._.ID_community@@article@@1134920-OR_rec-V_1-RL_community@@article@@1177167…]