进阶社工
近日无聊,看了一道社工题,如下:寻找拍照者所在的位置 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/85214755EARTH_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 * creturn 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.nrowscols = 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 * 1000if 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出题笔记/