duangsuse::Echo
🤔 想想 Scanner 是不是不够优雅...
我觉得就 Scanner 的逻辑结构上应该不够优雅,state 几乎是个笑话、lineDoUntil 非得加一个『keepLastLineOnce』才能用(doUntil 是在 scan body 里看到 new message header 的时候用的,可是等到这个 Message 返回,新 message 头会被下一次 iteration 直接忽视掉(因为我没设计好数据流,然后每次由判断 hasNext 的函数读新行的),导致漏掉偶数消息,不得不引入类似『mark/reset』的机制才可以),不过能用就好(跑路 🙈
duangsuse::Echo
telegramscanner.zip
最后写下 XML 序列化就彻底完成了!(因为这个最终是要用 Ruby 来查询数据的,虽然我有写 JavaFX GUI 的打算,可是我觉得还是晚一点好。
🤔 这是写 HTML 的节奏?虽然是 XML... 跑,反正都是 SGML 呢?(
telegram-scanner.jar
34.2 KB
Maven jar plugin 生成的 Jar application,可选 -test, -dump, -dump-yaml, -dump-debug-yaml
duangsuse::Echo
Photo
在 Ruby 里,要把它解析成 List & Object 的形式,只需要利用 Nokogiri:require 'nokogiri'
plain = File.read('test.xml')
doc = Nokogiri.parse(plain)
root = doc.children[0]
def collect_real_tags(xml)
i = 1; ret = []
while i < xml.size
ret << xml[i]
i += 2
end
return ret
end
real = collect_real_tags root.children
m = real.map { |n| n.children.find_all { |i| i.is_a? Nokogiri::XML::Element } }
m.map! { |a| a.find_all { |i| i.name == "dt" }.zip(a.find_all { |i| i.name == "dd" }).map { |n| [n.first.children[0].text, n.last.children.text] } }
m.map!(&:to_h)
r = m.dup最后再 post-process 一下就可以了
r.map! { |h| h.merge({'debug' => %w[no off line message_line].zip(h['debug'].match(/\{message_no=(\d+),\s*offset=(\d+),\s*line=(\d+),\s*message_line=(\d+)\}/).captures.map(&:to_i)).to_h, 'hashtags' => h['hashtags'].tr("[]", "").split(','), 'links' => h['links'].tr("[] ", "").split(',') }) }
# time
r.map! { |h| h.merge({ 'published' => Time.at(0, h['published'].to_i, :millisecond) }) }
duangsuse::Echo
在 Ruby 里,要把它解析成 List & Object 的形式,只需要利用 Nokogiri: require 'nokogiri' plain = File.read('test.xml') doc = Nokogiri.parse(plain) root = doc.children[0] def collect_real_tags(xml) i = 1; ret = [] while i < xml.size ret << xml[i] i += 2 end …
This media is not supported in your browser
VIEW IN TELEGRAM
🤔 下面就是本 #Telegram Channel 的消息内容统计信息了
duangsuse::Echo
在 Ruby 里,要把它解析成 List & Object 的形式,只需要利用 Nokogiri: require 'nokogiri' plain = File.read('test.xml') doc = Nokogiri.parse(plain) root = doc.children[0] def collect_real_tags(xml) i = 1; ret = [] while i < xml.size ret << xml[i] i += 2 end …
可惜没有绘制成图表 plot 好看一些 🤔
— 🔗 有 XXX 的消息条数
众所总周知,这种消息一般是很优秀的消息(跑),值得大家观摩,它们分别是:
https://t.me/dsuse/9512
它的总编号是 9512, 不过,因为零基数组微妙的差异(解析的时候用了两次零基数组),得加上 1 才可以
https://t.me/dsuse/9527
https://t.me/dsuse/9541
https://t.me/dsuse/9576
https://t.me/dsuse/9580
https://t.me/dsuse/9585
...
或者详细一点:
#Ruby #Project 一个失败的尝试,但是我也了解了二进制 IO 的一些信息
https:/...
https://t.me/dsuse/9541
https://zhuanlan.zhihu.com/p/60171538
#dotNet
...
https://t.me/dsuse/9576
#Mozilla #ES6 #JavaScript #frontend #backend 啊,的确,不...
https://t.me/dsuse/9580
#tech #CS 来科普一打有趣的信息技术相关知识: 🤗
1. Windows 里的 A: B: ...
https://t.me/dsuse/9585
5. 手机和磁卡放在一起,会不会『消磁』?
== 对于磁卡来说,『消磁』是什么?
以磁性介质存储...
https://t.me/dsuse/9586
6. 世界上第一个网站是什么?
惊闻刘国梁荣当乒协主席,深感高兴。虽然我们未曾有过交集,但乒乓球运动...
https://t.me/dsuse/9605
https://github.com/duangsuse/RandomPicture 我必须得感谢自己...
https://t.me/dsuse/9621
我待会把坑填完... #Android #blogPOst
https://blog.yuuta.m...
https://t.me/dsuse/9637
效率.... 🤐
那既然已经花了很多时间就再多花一点(皮)
演示一下这个功能:
[DuangSU...
https://t.me/dsuse/9638
最后,快速了解一下 #Android 系统服务 (https://blog.yuuta.moe/201...
https://t.me/dsuse/9643
https://github.com/LineageOS/android_frameworks_bas...
https://t.me/dsuse/9645
#blog #recommended https://bindog.github.io/
...
https://t.me/dsuse/9654
#CS #fix 下面我来给大家解释一下停机问题和 NP 困难到底是什么,和我这里提到的 NP-har...
https://t.me/dsuse/9663
现在开始讲解方才 @drakeet 的排序问题
5 没有被手动排序过,5 排在 1 前面,4 被手动...
https://t.me/dsuse/9676
#Android 类似的设计详询 Android Input Methods (https://dev...
https://t.me/dsuse/9684
感谢 @haoyet @eGluZl 等热心用户的建议,YuutaW 主要参照 https://www...
https://t.me/dsuse/9689
#通知
我们的MTProxy已经上线,欢迎使用
点击这里设置代理 (https://t.me/pro...
r.size #=> 187一共统计了 187 条消息。
r.sort_by { |it| it['published'] }.first['published']
=> 2019-03-24 11:22:00 +0800
第一条消息是 2019-03-24 11:22发送的
r.sort_by { |it| it['published'] }.last['published']
=> 2019-04-05 20:06:00 +0800
最后一条消息是2019-04-05 20:06发送的
— 🔗 有 XXX 的消息条数
r.find_all { |it| it['body_type'] == 'HAS_HASHTAGS' }.size
=> 42有 #Telegram Hashtag 的消息,一共有 42 条,约有 20% 的消息被打上了标签
r.find_all { |it| it['body_type'] == 'HAS_LINKS' }.size
=> 37
含链接的消息,一共有 37 条,约有 19% 的消息被打上了标签r.find_all { |it| it['body_type'] == 'HAS_LINKS_AND_HASTAGS' }.size
=> 17
都有的消息有 17 条,占总消息的 9%众所总周知,这种消息一般是很优秀的消息(跑),值得大家观摩,它们分别是:
r.sort_by { |it| it['debug']['no'] }
我们看到,第一条消息是 2019-03-24 11:22:00 的 AXMLParser 广播https://t.me/dsuse/9512
它的总编号是 9512, 不过,因为零基数组微妙的差异(解析的时候用了两次零基数组),得加上 1 才可以
puts r.find_all { |it| it['body_type'] == 'HAS_LINKS_AND_HASTAGS' }.map { |m| "https://t.me/dsuse/#{m['debug']['no'] + 9511 +1}" }.sort.join("\n")
::https://t.me/dsuse/9527
https://t.me/dsuse/9541
https://t.me/dsuse/9576
https://t.me/dsuse/9580
https://t.me/dsuse/9585
...
或者详细一点:
puts r.find_all { |it| it['body_type'] == 'HAS_LINKS_AND_HASTAGS' }.map { |m| "https://t.me/dsuse/#{m['debug']['no'] + 9511 +1}\n#{m['body'][0..50]}...\n" }.sort.join("\n")
https://t.me/dsuse/9527#Ruby #Project 一个失败的尝试,但是我也了解了二进制 IO 的一些信息
https:/...
https://t.me/dsuse/9541
https://zhuanlan.zhihu.com/p/60171538
#dotNet
...
https://t.me/dsuse/9576
#Mozilla #ES6 #JavaScript #frontend #backend 啊,的确,不...
https://t.me/dsuse/9580
#tech #CS 来科普一打有趣的信息技术相关知识: 🤗
1. Windows 里的 A: B: ...
https://t.me/dsuse/9585
5. 手机和磁卡放在一起,会不会『消磁』?
== 对于磁卡来说,『消磁』是什么?
以磁性介质存储...
https://t.me/dsuse/9586
6. 世界上第一个网站是什么?
惊闻刘国梁荣当乒协主席,深感高兴。虽然我们未曾有过交集,但乒乓球运动...
https://t.me/dsuse/9605
https://github.com/duangsuse/RandomPicture 我必须得感谢自己...
https://t.me/dsuse/9621
我待会把坑填完... #Android #blogPOst
https://blog.yuuta.m...
https://t.me/dsuse/9637
效率.... 🤐
那既然已经花了很多时间就再多花一点(皮)
演示一下这个功能:
[DuangSU...
https://t.me/dsuse/9638
最后,快速了解一下 #Android 系统服务 (https://blog.yuuta.moe/201...
https://t.me/dsuse/9643
https://github.com/LineageOS/android_frameworks_bas...
https://t.me/dsuse/9645
#blog #recommended https://bindog.github.io/
...
https://t.me/dsuse/9654
#CS #fix 下面我来给大家解释一下停机问题和 NP 困难到底是什么,和我这里提到的 NP-har...
https://t.me/dsuse/9663
现在开始讲解方才 @drakeet 的排序问题
5 没有被手动排序过,5 排在 1 前面,4 被手动...
https://t.me/dsuse/9676
#Android 类似的设计详询 Android Input Methods (https://dev...
https://t.me/dsuse/9684
感谢 @haoyet @eGluZl 等热心用户的建议,YuutaW 主要参照 https://www...
https://t.me/dsuse/9689
#通知
我们的MTProxy已经上线,欢迎使用
点击这里设置代理 (https://t.me/pro...
Telegram
duangsuse::Echo
AXMLParser parser = new AXMLParser(apkFileInputStream);
int eventType = parser.getType();
while (eventType != AXMLParser.END_DOCUMENT) {
String parserName = parser.getName();
boolean isManifest = "manifest".equals(parserName);
[...]
eventType…
int eventType = parser.getType();
while (eventType != AXMLParser.END_DOCUMENT) {
String parserName = parser.getName();
boolean isManifest = "manifest".equals(parserName);
[...]
eventType…