进阶社工
进阶社工
近日无聊,看了一道社工题,如下:寻找拍照者所在的位置 xx省xx市xx县xx路口/与xx路口交汇处
传统社工的思路
- 先根据车牌号 大致定位到 湖南省郴州市。
- 接下来通过抖音/大众点评/美团 搜索郴州市所有的银行/酒店,根据银行/酒店的外观进行一步步筛选,最后定位到具体位置。
传统社工显然纯纯体力活,非常浪费时间和精力,这里我无意中看到一篇进阶社工的文章,来介绍一下。
进阶社工
进阶社工使用到了一款叫做 《EasyPoi百度地图版》的工具,这款工具可以导出这个城市所有银行的地理位置信息,包括经纬度等信息
https://github.com/soaringsoul/easypoi

如下:

那我们就可以先检索这个城市的所有酒店的经纬度,再检索这个城市的所有酒店的经纬度,最后根据银行与酒店的距离进行筛选。
脚本如下:
import xlrd
import math
# 计算两个经纬度之间的距离
def calc_distance(lat1, lon1, lat2, lon2):
# 计算两个经纬度之间的距离
# 公式参考:https://blog.csdn.net/jia20003/article/details/85214755
EARTH_RADIUS = 6378.137 # 地球半径
rad_lat1 = math.radians(lat1)
rad_lat2 = math.radians(lat2)
delta_lat = math.radians(lat2 - lat1)
delta_lon = math.radians(lon2 - lon1)
a = math.sin(delta_lat / 2) * math.sin(delta_lat / 2) + math.cos(rad_lat1) * math.cos(rad_lat2) * math.sin(
delta_lon / 2) * math.sin(delta_lon / 2)
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
distance = EARTH_RADIUS * c
return distance
# 读取excel中的经纬度信息
def read_excel(file_name):
# 打开Excel文件
workbook = xlrd.open_workbook(file_name)
# 获取所有sheet
#sheet_name = workbook.sheet_names()
# 根据sheet索引或者名称获取sheet内容
sheet = workbook.sheet_by_name('poi数据')
# 获取行数和列数
rows = sheet.nrows
cols = sheet.ncols
# 读取经纬度信息
data = []
for i in range(rows):
row_data = sheet.row_values(i)
data.append(row_data)
return data
# 计算excel中所有经纬度之间的距离
# def calc_all_distance(data,data2):
# #计算excel中所有经纬度之间的距离
# min_distance=999999
# min_list=[]
# for i in range(1,len(data2)):
# for j in range(1,len(data)):
# # 获取两个经纬度
# lat1 = float(data2[i][17])
# lon1 = float(data2[i][16])
# lat2 = float(data[j][17])
# lon2 = float(data[j][16])
# # 计算距离
# distance = calc_distance(lat1, lon1, lat2, lon2)
# if distance < min_distance:
# min_distance=distance
# min_name1=data[j][0]
# min_name2=data2[i][0]
# list_data = [min_name2, min_name1, min_distance]
# min_distance=999999
# min_list.append(list_data)
# sorted_list = sorted(min_list, key=lambda x: x[2])
# fp = open("./filter.log","w",encoding="utf8")
# for k in range(len(sorted_list)):
# print('['+str(k)+']'+sorted_list[k][0]+'和'+sorted_list[k][1]+'两点之间的距离:'+str(sorted_list[k][2]*1000)+' m')
# x = '['+str(k)+']'+sorted_list[k][0]+'和'+sorted_list[k][1]+'两点之间的距离:'+str(sorted_list[k][2]*1000)+' m'
# fp.write(x+"\n")
# fp.close()
def calc_all_distance(data,data2):
#计算excel中所有经纬度之间的距离
min_list=[]
for i in range(1,len(data2)):
for j in range(1,len(data)):
# 获取两个经纬度
lat1 = float(data2[i][17])
lon1 = float(data2[i][16])
lat2 = float(data[j][17])
lon2 = float(data[j][16])
# 计算距离
distance = calc_distance(lat1, lon1, lat2, lon2)
dis_m = distance * 1000
if dis_m >= 100 and dis_m <= 200:
min_name1=data[j][0]
min_name2=data2[i][0]
list_data = [min_name2, min_name1, distance]
min_list.append(list_data)
sorted_list = sorted(min_list, key=lambda x: x[2])
fp = open("./filter.log","w",encoding="utf8")
for k in range(len(sorted_list)):
print('['+str(k)+']'+sorted_list[k][0]+'和'+sorted_list[k][1]+'两点之间的距离:'+str(sorted_list[k][2]*1000)+' m')
x = '['+str(k)+']'+sorted_list[k][0]+'和'+sorted_list[k][1]+'两点之间的距离:'+str(sorted_list[k][2]*1000)+' m'
fp.write(x+"\n")
fp.close()
if __name__ == '__main__':
# 读取excel中的经纬度信息
data = read_excel('./酒店.xlsx')
data2 = read_excel('./银行.xlsx')
# 计算excel中所有经纬度之间的距离
calc_all_distance(data,data2)
可以检索得到:
事实上,如果可以的话,我们还可以引入第三个地理位置的经纬度,来再次进行筛选,或者我们也可以根据银行/酒店的名字、建筑规模来进行过滤。
一些不可忽视的问题
- easypoi的神秘码需要充值才能使用。而且并不便宜。
- 需要准确判断银行与酒店的距离才行,比如,我一开始以为这个银行与酒店最多50米远,没想到有124米的距离,这样的话,就会浪费了很多人力。
- 再次使用easypoi的时候需要先删除
.rwb_soft\easypoi_baidu\tempdata\
目录下的.csv文件才行
参考: https://fushuling.com/index.php/2023/04/23/das4-secret-of-bkfish出题笔记/