进阶社工

进阶社工

近日无聊,看了一道社工题,如下:寻找拍照者所在的位置 xx省xx市xx县xx路口/与xx路口交汇处

你猜猜这是哪?

传统社工的思路

  1. 先根据车牌号 大致定位到 湖南省郴州市。
  2. 接下来通过抖音/大众点评/美团 搜索郴州市所有的银行/酒店,根据银行/酒店的外观进行一步步筛选,最后定位到具体位置。

传统社工显然纯纯体力活,非常浪费时间和精力,这里我无意中看到一篇进阶社工的文章,来介绍一下。

进阶社工

进阶社工使用到了一款叫做 《EasyPoi百度地图版》的工具,这款工具可以导出这个城市所有银行的地理位置信息,包括经纬度等信息

https://github.com/soaringsoul/easypoi

image-20250126175429092

如下:

image-20250126175548344

那我们就可以先检索这个城市的所有酒店的经纬度,再检索这个城市的所有酒店的经纬度,最后根据银行与酒店的距离进行筛选。

脚本如下:

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)

可以检索得到:

image-20250126175837895

事实上,如果可以的话,我们还可以引入第三个地理位置的经纬度,来再次进行筛选,或者我们也可以根据银行/酒店的名字、建筑规模来进行过滤。

一些不可忽视的问题

  • easypoi的神秘码需要充值才能使用。而且并不便宜。
  • 需要准确判断银行与酒店的距离才行,比如,我一开始以为这个银行与酒店最多50米远,没想到有124米的距离,这样的话,就会浪费了很多人力。
  • 再次使用easypoi的时候需要先删除 .rwb_soft\easypoi_baidu\tempdata\目录下的.csv文件才行
    image-20250126180435742

参考: https://fushuling.com/index.php/2023/04/23/das4-secret-of-bkfish出题笔记/

posted @ 2025-01-26 18:40  TLSN  阅读(49)  评论(0)    收藏  举报