关于 github 上一个链家爬虫代码的困惑

2017-11-17 22:55:37 +08:00
 eternal403

想抓取链家的 app 数据,在 github 上找到一个看上去不错的项目: https://github.com/CaoZ/Fast-LianJia-Crawler,

但是我对代码有两处有点疑惑,没看懂是怎么来的。

  1. 首先是 app/config.py 下面的这段代码
self.lian_jia = {
            'ua': 'HomeLink7.7.6; Android 7.0',
            'app_id': '20161001_android',
            'app_secret': '7df91ff794c67caee14c3dacd5549b35'
        }

作者是怎么知道 app_id 和 app_secret 的,我通过 Charles 抓包工具,看到 header 头信息有一大堆东西,没看到 app_id 和 app_secret 不知道作者是怎么试出来的。

  1. app/util/init.py

get_token 这个方法,为什么作者知道 token 是这么产生的。

def get_token(params):
    data = list(params.items())
    data.sort()

    token = config.lian_jia['app_secret']

    for entry in data:
        token += '{}={}'.format(*entry)

    token = hashlib.sha1(token.encode()).hexdigest()
    token = '{}:{}'.format(config.lian_jia['app_id'], token)
    token = base64.b64encode(token.encode()).decode()

    return token

如果有哪位同学可以试试用 charles 抓取链家的包,查看 header 等相关信息。看看能不能找出相关规律。

7118 次点击
所在节点    Python
9 条回复
Kirscheis
2017-11-17 23:46:59 +08:00
反编译 apk 可以得到一些信息,其它信息一般是抓包之后猜测算法得到的。。
0987363
2017-11-18 09:54:48 +08:00
反编译 app 出来的吧 以前弄过斗鱼的 然后斗鱼写进 so 了。。
eternal403
2017-11-18 15:05:13 +08:00
@0987363 @Kirscheis 不知是不是我姿势不对,反编译了下链接的 apk,仍然没有找到代码,不知道是不是要处理混淆。不知道两位方不方便试试,谢谢。
forestyuan
2017-11-18 20:24:37 +08:00
兴许那段代码是 LJ 内部人士写的呢
eternal403
2017-11-19 10:39:15 +08:00
@forestyuan 我也考虑过,哈哈
caoz
2017-11-21 16:44:14 +08:00
作者登场~

我当时确实反编译了链家的安卓端 App,但是反编译了也没找到这些值到底在哪儿(毕竟不是专业 Java ...)😓 于是放狗一搜找到了一个项目: https://github.com/laopeng1990/realestate, 在 https://github.com/laopeng1990/realestate/blob/master/src/main/java/com/wpf/realestate/util/AuthUtils.java 找到了加密方式...

不过后来知道了,这些值和加密部分是分别放到了 "libHomeLinkNdk.so" 和 "liblianjiajni.so" 中了,用 IDA Pro 打开处理下就可以看到了,比如 app_id 藏在这:

RuoYun
2017-11-22 18:29:42 +08:00
厉害了
huhuanru
2019-08-03 07:59:49 +08:00
@caoz 作者你好,这个程序已经不能用了,会报“无效的请求”,报错如下:
Traceback (most recent call last):
File "Fast-LianJia-Crawler/app/main.py", line 209, in <module>
main()
File "Fast-LianJia-Crawler/app/main.py", line 20, in main
update_city(city_id)
File "Fast-LianJia-Crawler/app/main.py", line 30, in update_city
city_info = get_city_info(city_id)
File "Fast-LianJia-Crawler/app/main.py", line 73, in get_city_info
data = util.get_data(url, payload, method='POST')
File "Fast-LianJia-Crawler\app\util\__init__.py", line 27, in get_data
return parse_data(r)
File "Fast-LianJia-Crawler\app\util\__init__.py", line 35, in parse_data
raise Exception('请求出错了: ' + as_json['error'])
Exception: 请求出错了: 无效的请求
huhuanru
2019-08-03 22:21:15 +08:00
@caoz 作者同学可以冒泡一下吗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/407375

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX