2022年3月

太复杂的包咱们打不来,咱们先从最简单的壁纸包开始打起。

打包 packing ” 是什么?在 Linux 语境中,“打包”是指制作可以在 Linux 上用软件包管理器来安装、更新和卸载的软件包。

你肯定要问了,什么要打包?举例来说,你肯定有过拍一些照片并且将它们设置为壁纸的经历,对吧。一个个传到计算机上去挺累的。把这些收集起来,打成一个壁纸包,与其他人分享是个不错的选择。顺便,通过打包,也可以对 Debian 的软件包有个大致的了解。

背景介绍

《崩坏 3》,是一个我很喜欢玩的游戏,但它不支持 Linux 平台,所以,望梅止渴的我只好把这些壁纸进行打包,以此纪念和女武神们并肩战斗过的时光。

本文中介绍的打包是给 Debian/Ubuntu 系所用的 deb 包,其他系或独立发行版请按所属发行版的官方手册进行打包工作。

准备工作

先准备如下工具 wgettardh-makedebmakelintian(有一些应该在你 Linux 上已经安装过了):

~ $ sudo apt install wget tar dh-make debmake lintian

先建立打包文件夹:

make $ mkdir -p honkai-impact3-0.1/usr/share/background/honkai-impact3

更换壁纸的时候你应该注意到了,通常壁纸的存放位置都是在 /usr/share/background 目录里的,所以这里建立了相应的多级目录。

你也可以用你自己拍摄的照片来打包,本文所用的演示图片均来自于《崩坏 3》官网,你可以自行下载。

开始打包

然后,退回到上级目录里,将存放壁纸的目录压缩成一个 tar 包:

honkai-impact3-0.1 $ cd ..
make $ tar -cvzf honkai-impact3-0.1.tar.gz honkai-impact3-0.1/usr/share/background/honkai-impact3

压缩包创建好之后,我们还得设置两个变量,这样软件包维护工具就可以正确识别维护者信息了:

make $ cat >> ~/.bashrc <<EOF
DEBEMAIL="bronya_zaychik@st_freya_academy.edu"
DEBFULLNAME="Bronya Zaychik"
export DEBEMAIL DEBFULLNAME
EOF
make $ . ~/.bashrc

此处:

  • DEBEMAIL 写你的邮箱地址
  • DEBFULLNAME 写维护者的名字

初始化

make $ cd honkai-impact3-0.1 
honkai-impact3-0.1 $ dh_make -f ../honkai-impact3-0.1.tar.gz
Type of package: (single, indep, library, python)
[s/i/l/p]?
Maintainer Name     : Bronya Zaychik
Email-Address       : bronya_zaychik@st_freya_academy.edu
Date                : Wed, 02 Feb 2022 07:00:28 +0000
Package Name        : honkai-impact3
Version             : 0.1
License             : blank
Package Type        : library
Are the details correct? [Y/n/q]

dh_make 是个不错的工具,这工具用于初始化压缩包并生成模板文件。下面的 debian 文件夹就是用这个工具生成的。

在初始化完成之后,你会看到如下文件:

honkai-impact3-0.1 $ cd ..
make $ ls -F
honkai-impact3-0.1/
honkai-impact3-0.1.tar.gz
honkai-impact3_0.1.orig.tar.gz

debian 文件夹里却有了很多模板文件,在一阵怒砍之后,只留下如下文件:

make $ ls -F honkai-impact3-0.1/debian/
source/
changelog
control
copyright
rules

其中,changlog 文件是用来记录版本更新内容的变更日志。

例如:

honkai-impact3-0.1 $ cat debian/changelog
honkai-impact3-background (0.1-1) unstable; urgency=medium

  * 2020.8.17 首次打包完成
  * 2022.2.2  重新打包

 -- Bronya Zaychik <bronya_zaychik@st_freya_academy.edu> Wed, 02 Feb 2022 07:20:00 +0000

honkai-impact3-background (0.1-1) unstable; urgency=medium

  * Initial release 

 -- Bronya Zaychik <bronya_zaychik@st_freya_academy.edu> Wed, 02 Feb 2022 07:00:28 +0000

control 文件用来记录壁纸包的版本信息:

honkai-impact3-0.1 $ cat debian/control
Package: honkai-impact3-background
Version: 0.1-1
Architecture: all
Maintainer: Bronya Zaychik <bronya_zaychik@st_freya_academy.edu>
Section: x11
Priority: optional
Homepage: https://gitee.com/PokerFace128/K423_Lab_Soft
Description: This is the game wallpaper of the HokaiImpact3.
 TECH OTAKUS SAVE THE WORLD

说明如下:

  • 第 1-2 行是包名和版本号
  • 第 3 行是可以编译该二进制包的体系结构,通常文本、图像、或解释型语言脚本所生成的二进制包都用 Architecture: all
  • 第 4 行是维护者信息
  • 第 5 行是分类,这里我们选择为 x11,这是不属于其他分类的为 X11 程序
  • 第 6 行是优先级,这个为常规优先级。
  • 第 7 行是维护者的个人主页,GitHub、Gitee,甚至是你的 BiliBili 主页都可以。
  • 第 8 行是对这个软件包的描述
  • 第 9 行建议写点什么上去,这样在用 lintian 检查的时候就不会空了。

最后是 copyright 文件,用来存放版权信息。就是该软件包内文件的版权说明。至于这个示例壁纸包,由于版权属于该游戏出品方,作为演示用途,我这里就没填。

开始打包

只需一个命令,就可轻松打包:

make $ cd honkai-impact3-0.1/
honkai-impact3-0.1 $ dpkg-buildpackage -us -uc

你应该用过 dpkg -i 这条命令,dpkg 工具不只能安装,还能打包和拆包。

啪的一下,一个壁纸包就这样打好了:

honkai-impact3-0.1 $ cd ../
make $ ls -F 
honkai-impact3-0.1/                   
honkai-impact3_0.1-1_amd64.changes  
honkai-impact3_0.1-1.debian.tar.xz  
honkai-impact3_0.1.orig.tar.gz
honkai-impact3_0.1-1_amd64.buildinfo  
honkai-impact3_0.1-1_amd64.deb      
honkai-impact3_0.1-1.dsc            
honkai-impact3-0.1.tar.gz

接下来用 lintian 检查

make $ lintian honkai-impact3_0.1-1_amd64.deb   

E: honkai-impact3-background: copyright-contains-dh_make-todo-boilerplate
E: honkai-impact3-background: helper-templates-in-copyright
W: honkai-impact3-background: copyright-has-url-from-dh_make-boilerplate

这里显示我没填 copyright 文件,这里需要你填入版权信息,像壁纸类的话,通常都是 CC 协议。

打包好之后就像这样:

如果你想了解关于 deb 打包的更多内容,请看如下链接:https://www.debian.org/doc/manuals/maint-guide/index.zh-cn.html

作者注:因读者多次吐槽,文章经过了反复修改。详情请看 GitHub 上的 PR。


作者简介:

PokerFace,一个会空中劈叉的老舰长(睿智清洁工)。


作者:PokerFace 编辑:wxy

本文由贡献者投稿至 Linux 中国公开投稿计划,采用 CC-BY-SA 协议 发布,Linux中国 荣誉推出

最近股市又哀鸿遍野……于是,那句 “树莓派是最好的理财产品” 又开始在我耳边萦绕。“缺芯”笼罩之下,开发板的供货出了问题,小伙伴的一句玩笑话,恰若人世间真实。因为稀缺,好板子再贵也有人要,理财属性显露无疑!笔者游走在各大软硬件社区、众阿婆主频道,评论区最常见的就是: “那么……在哪里才能买得到呢?”

本着寻找未来开发板二手交易市场“扛把子”的初心,我给大家整理了 5 款值得收藏的 Linux 开发板,有些已经涨价很多了。至于未来还能不能继续“理财”,大家自行判断哈~ 还是那句话,投资有风险。

树莓派 4B

先看个价格趋势图吧,进入 2022 年,4GB 内存树莓派 4B 在欧洲市场的价格基本稳定在 €90,8GB 的价格基本在 €160 以上,涨幅均在 50% 以上。这在中国市场也差不多。要知道,树莓派 4 和树莓派 3 两兄弟的价格在 2021 年已经整整翻了一倍……写到这里,我留下了悔恨的泪水,为什么没有趁着便宜多买几片……

来自 Geizhals price comparison website

言归正传,为什么推荐树莓派 4 呢? 树莓派本身可玩性极高,与 3 代相比,树莓派 4 全面升级,拥有更快的运行速度、更大内存,桌面性能堪比入门级 x86 PC,接口全面升级。麻雀虽小,五脏俱全,插上 micro-SD 卡,接上鼠标、键盘、显示器后,树莓派 4 便能当成电脑使用。

规格就不多介绍啦,请 查看官网 了解。

官方提供的 树莓派操作系统 Raspberry Pi OS 是基于 Debian 的操作系统,针对树莓派的硬件进行了优化。该操作系统带有超过 35,000 个软件包,预编译的软件以一种很好的格式捆绑在一起,便于安装。强大的软件生态,是树莓派在众多开发板中脱颖而出的关键之一。

大胆预测,“缺芯”问题解决不了,树莓派 4 的价格还会有一波上涨,至于哪里能买到,就各凭本事了……

昉·星光 VisionFive

国货之光!RISC-V 的开山之作!现在业内普遍认为,RISC-V 最终将与 x86、ARM 形成三分天下的局面。

星光板由国内领先的 RISC-V 芯片公司赛昉科技倾力打造,在去年 12 月正式登场。作为全球首款可运行 Linux 的 RISC-V 开发板,星光板承载了 RISC-V 软件生态建设的使命,是各大社区进行 RISC-V 软件适配的“必备”。

目前,官方推荐的操作系统是 Fedora,工具链成熟度较高。在各大社区也有热心网友制作了 Ubuntu、Debian 等主流操作系统的镜像包。为了促进 RISC-V 软件生态的快速发展,赛昉推出了 RVspace 开源社区 https://rvspace.org/。作为芯片原厂支持下的开源社区,RVspace 提供最专业的文档、技术支持。

目前,该社区已经吸引了众多国内外 RISC-V 大牛入驻。这也是我看好星光板的一大原因,依托芯片原厂的社区支持,在开源世界众多开发者的贡献下,星光板在未来一定有极大的可玩空间!多提一嘴,星光板搭载的 JH7100 SoC 已经并入 Linux 内核 5.17 主线,说明 Linux 社区还是很认可这款芯片的。

星光板在国内的售价有点小贵,1100 元,在 iceasy 上搜 VisionFive 就能找到。

ODROID C4

有朋友说,这是一款秒杀树莓派的板子。我不置可否,不过个人感觉,ODROID C4 是 ODROID 家族中性价比最高的一位,售价 $54 。能不能买到真的要看运气了,产量据说极少。它的外观几乎照抄了树莓派的设计,对于习惯使用树莓派的小伙伴来说再亲切不过了~

ODROID C4 搭载效能很高的 Amlogic S905X3 SoC,具有 4 个最高主频为 2GHz 以上的 Arm Cortex-A55 处理器核心,下图是 ODROID C4 与其他 ODROID 及树莓派 4 的 CPU 跑分对比,性能略优于树莓派 4。主频高达 650MHz 的 Mali-G31MP GPU的跑分也给大家列出来了。

CPU 跑分

GPU 跑分

ODROID C4 有着不逊于甚至超过树莓派 4 的性能,并拥有丰富的原生接口。尽管它的软件生态没有树莓派那么丰富,在一些对性能要求很高的细分领域,如需要高解析力的图像编码应用领域,它一定是树莓派 4 的完美替代者。由于其产量极少,相信在软件生态逐步完善的过程中,其价值也会逐步放大。

特别提一下 ODROID HC4,在 ODROID C4 基础上多了两个 SATA 口,适合用于家庭 NAS 存储的开发板,售价 $65,有这方面需求的小伙伴也可以看看。

Odyssey X86J4105

看它的名字就知道,这款微型 PC 使用英特尔赛扬 J4105 处理器,拥有 4M 高速缓存,工作频率高达 2.5GHz。除了运行官方推荐的 Windows 10,强大的处理器也能完美运行 Linux 发行版。

这是一款接口功能非常强大的开发板,它提供集成了兼容 Microchip SAMD21 Arduino 微控制器,以及与树莓派兼容的 40 针 GPIO 接头。CNXSoft 还专门做了一期做了树莓派和 Arduino 接头测试

UHD GPU 使这块板子拥有强大的图像处理功能,可以完美播放 4K 视频。M.2 PCIe 2.0 x4 插槽可容纳高性能 NVMe SSD,全尺寸 SATA-III 连接器可以连接任何标准 SATA 驱动器, 8GB 的 RAM 让这台机器有足够的空间来运行 FreeNAS 和 XigmaNAS。

Seeed 的官方商城 上这款开发板目前处在缺货状态。

作为一款算力强大、功能丰富的开发板,它已然是树莓派的极有力竞争者。可以想象,一旦重新上架,需要秒抢。

NVIDIA Jetson Nano

这款入门级的边缘 AI 计算平台,在 2021 年已经涨价近 80%!!!笔者逛遍了海内外各大商场,全部没有现货,如果你手里有的话,一定要好好珍惜~

它的性能当然比不上老大哥 Jetson TX2 和 Jetson Xavier,但价格和功耗也是最低,算是一个平衡。在对算力要求较低的嵌入式 AI 应用场景中,Jetson Nano 是再好不过的选择,比如小型移动机器人、人脸识别打卡、智能门锁、智能音箱等。Jetson Nano 最大优势还是在体积上,其核心板可拆且只有 70 x 45 mm 大小,方便集成在各种嵌入式应用中。

Jetson Nano 使用 Ubuntu 系统,安装过程十分简单,而且英伟达提供纯中文页面的资料库和操作指南,不愧是国际大厂!英伟达为 Jetson 产品提供社区支持,开发者在社区中积极发布各种视频、指南和开源项目。英伟达也提供各种免费教程,看了一下,从入门级的 “Hello AI World”,一直到机器人项目如开源 NVIDIA JetBot AI 机器人,都有。

官方给这块板子的用途定义为产品开发、学习和教育。随着越来越多关心嵌入式 AI 的同学出现,相信这块板子会经常被拿出来讨论。

写在最后

树莓派依托良好的生态获得众多拥趸,英伟达的 AI 产品一枝独秀,类树莓派的开发板来势汹汹,架构新贵 RISC-V 扬帆启航,未来,谁能成为开发板中的“最佳理财产品”,让我们拭目以待~

祝大家不论炒股还是购买开发板,都能玩得开心,早日暴富~

微软正在测试 Windows 11 文件管理器中的广告

有用户爆料,最新的 Windows 11 Insider 的文件管理器中出现了微软的广告,例如,如何“利用微软编辑器的高级写作建议,在文档、电子邮件和网络中自信地写作。”这很可能是微软在进行 A/B 测试实验,因为不是每个用户都会看到这种广告。这并不是微软第一次在其应用内添加广告,2016 年,微软在 Windows 应用程序中显示了 OneDrive 广告,在写字板菜单栏中推送其免费 Office Web 应用的广告,在 Windows 10 开始菜单中显示 Edge 的广告等等。

老王点评:我就不知道微软在想什么,是觉得 Windows 用户对广告接受度比较高?

英特尔发现了 AMD 幽灵缺陷的缓解措施存在漏洞

本周,发现了只影响英特尔和 Arm 处理器的新幽灵缺陷。但英特尔围绕这些新攻击载体的研究发现,AMD 用于修复该缺陷的补丁之一自 2018 年以来一直就是坏的,该缓解措施并不充分。这个问题影响了几乎所有的现代 AMD 处理器。作为回应,AMD 发布了一份安全公告,点名感谢英特尔的 STORM 团队,但称它没有发现任何使用该方法的攻击利用,并更新了其指导意见,建议使用替代方法来缓解该缺陷,从而修复了这个问题。

老王点评:AMD:谢谢啊,真心的。

微软声称在量子计算机系统方面取得突破

像所有声称量子计算优势的组织一样,微软认为它所谓的“拓扑量子比特”是通向“量子计算机的基石,预计将比用已知其他类型的量子比特建造的机器更稳定。”微软表示,这个突破是创建百万级量子比特的量子计算机的下一步,许多人认为这是解决目前经典计算机不可能解决的大规模问题所需的最低规格的里程碑。

老王点评:当量子计算机能进入实用时,将堪比当年计算机的发明,甚有过之。

Nitrux OS 是一个基于 Debian 的有趣的 Linux 发行版。还没有试过吗?我认为你应该试试。

Nitrux 系统也许算不上 Linux 的主流发行版本之一,但它绝对是一款极其独特的产品。

2019 年,我们 采访了 Nitrux 的创始人 Uri Herrera,了解到 Herrera 等人开发这款系统的初衷:超越传统的 Linux 发行版。

自那之后,过了许久,我们终于迎来了 Nitrux 2.0 版本

不要忘了,Nitrux 在去年 放弃基于 Ubuntu,而选择了 Debian

考虑到自 Nitrux 发行以来的数年间,也发生了许多变化,你应该尝试一下这款系统。

这里,我要分享一些体验 Nitrux 系统 的理由:

1、Nitrux 不再基于 Ubuntu

人们一般都会推荐基于 Ubuntu 的 Linux 发行版本,来满足日常所需。

当然,在我们 为新手推荐的 Linux 系统 中,也主要是许多基于 Ubuntu 的版本,但是请不要误会。

我们之所以推荐基于 Ubuntu 的发行版本,唯一的理由在于它们简单易用,支持大量的商业软件。

所以,如果你不是刚开始使用 Linux 系统,同时也想尝试既能让你耳目一新,又不至于使你感到陌生,而且十分稳定的发行版,基于 Debian 的 Nirtux 是一个不错的选择。

你完全不需要在短期内迅速了解这款系统,就可以得心应手地使用终端来完成各项工作。

感兴趣的话,可以参考我们的文章 Debian vs Ubuntu,了解更多。

2、专注 AppImage

AppImage 是一个通用的打包系统,这种软件包不需要任何依赖。你不需要在 Linux 上安装任何软件包管理器或者依赖包,就可以直接运行 AppImage 应用。

AppImage 旨在打造便携、高效的软件包系统,省去安装的步骤,与 Windows 系统的便携版软件非常相似。

Nitrux 操作系统专注 AppImage 应用软件,为你带来流畅的用户体验。

NX 软件中心是一个 GUI 程序,用户可以通过使用 Mauikit(该软件中心的 UI 框架),安装、管理 AppImage 应用程序。

3、基于 KDE 桌面环境的发行版

Nitrux 操作系统是 搭载 KDE 桌面环境中最好的 Linux 发行版 之一。 如果你不喜欢 GNOME 或者其他开箱即用的桌面环境(DE),KDE 会是一个不错的选择。

也许你还不知道, 相较于其他桌面环境,KDE 可以在很多方面进行定制

因此,在 KDE 桌面环境下,你可以毫不费力地打造自己的个性化桌面。

4、独特的用户体验

Nitrux 的用户体验结合了最好的 KDE 桌面环境与 Qt 技术,并对这些进行了调整,为你带来全新的用户体验。

虽然在使用 Nitrux 操作系统时,你不会觉得十分陌生,但是还是会感到有些许的不同。

即使你没有对 Nitrux 系统做任何自定义的设置,开箱即用的体验也足以让它成为 最优雅的发行版 之一。

5、Maui Shell

Maui Shell 是 Nitrux 用户体验的亮点之一。近来,Maui Shell 得到了进一步的完善,将这些呈现在了桌面端和移动端的融合界面上。

尽管 Maui Shell 目前还不成熟,但是外观看起来十分大气简约,就像 System76 将要推出基于 Rust 的桌面环境 一样令人兴奋。

这也是我们推荐尝试 Nitrux 操作系统最重要的原因之一。时间会证明,Nitrux 系统是否将会开启桌面体验的全新时代。

6、Xanmod 内核

Xanmod 内核 是一个定制的主线 Linux 内核版本,对性能进行了适当的调整,附加了一些其他功能。有了它,你的桌面体验一定能得到大幅提升。

自 2.0 版本起,Nitrux 操作系统选用 Xanmod 作为默认内核,为用户提供“升级版”的桌面体验。

当然你也可以选择其他 Linux 内核,比如 Liquorix 和 Libre,各擅胜场。

如果你不喜欢 Xanmod,也可以选择长期支持版的主线内核。在 Nitrux 操作系统上,你完全可以无缝切换使用不同的内核。

总结

诚然,从主流发行版转到像 Nitrux 这样的操作系统,需要考虑各种风险。

但是,我建议你好好考虑一番:

Nitrux 这样的发行版热衷于按照他们的愿景来改进事情。

尽管背后没有强大的企业和财力支撑,他们依然可以开发出这款令人惊艳的发行版、开发出 Maui 项目,以及别开生面的 Maui shell。

所以,我认为,我们也应该以己所能,尽己之力,支持这些优秀的发行版。

不过话说回来,每一款 Linux 发行版都会或多或少地存在一些问题。当你试用一款新的发行版时,你需要给它点儿时间,在最终将它作为日常使用的操作系统之前,慢慢地去适应它。

换言之,我推荐你在业余时间试用 Nitrux 操作系统,或者直接装个虚拟机来一探究竟。

我很关注大家对这篇文章的看法,请在下方评论留言。


via: https://news.itsfoss.com/reasons-to-try-nitrux-os/

作者:Ankush Das 选题:lujun9972 译者:aREversez 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

大家好!几天前我写了篇 小型的个人程序 的文章,里面提到了调用没有文档说明的“秘密” API 很有意思,你需要从你的浏览器中把 cookies 复制出来才能访问。

有些读者问如何实现,因此我打算详细描述下,其实过程很简单。我们还会谈谈在调用没有文档说明的 API 时,可能会遇到的错误和道德问题。

我们用谷歌 Hangouts 举例。我之所以选择它,并不是因为这个例子最有用(我认为官方的 API 更实用),而是因为在这个场景中更有用的网站很多是小网站,而小网站的 API 一旦被滥用,受到的伤害会更大。因此我们使用谷歌 Hangouts,因为我 100% 肯定谷歌论坛可以抵御这种试探行为。

我们现在开始!

第一步:打开开发者工具,找一个 JSON 响应

我浏览了 https://hangouts.google.com,在Firefox的开发者工具中打开“ruby网络rtNetwork/rt/ruby”标签,找到一个 JSON 响应。你也可以使用 Chrome 的开发者工具。

打开之后界面如下图:

找到其中一条 “ 类型 Type ” 列显示为 json 的请求。

为了找一条感兴趣的请求,我找了好一会儿,突然我找到一条 “people” 的端点,看起来是返回我们的联系人信息。听起来很有意思,我们来看一下。

第二步:复制为 cURL

下一步,我在感兴趣的请求上右键,点击 “复制Copy” -> “ 复制为 cURL Copy as cURL ”。

然后我把 curl 命令粘贴到终端并运行。下面是运行结果:

$ curl 'https://people-pa.clients6.google.com/v2/people/?key=REDACTED' -X POST ........ (省略了大量请求标头)
Warning: Binary output can mess up your terminal. Use "--output -" to tell 
Warning: curl to output it to your terminal anyway, or consider "--output 
Warning: <FILE>" to save to a file.

你可能会想 —— 很奇怪,“二进制的输出在你的终端上无法正常显示” 是什么错误?原因是,浏览器默认情况下发给服务器的请求头中有 Accept-Encoding: gzip, deflate 参数,会把输出结果进行压缩。

我们可以通过管道把输出传递给 gunzip 来解压,但是我们发现不带这个参数进行请求会更简单。因此我们去掉一些不相关的请求头。

第三步:去掉不相关的请求头

下面是我从浏览器获得的完整 curl 命令。有很多行!我用反斜杠(\)把请求分开,这样每个请求头占一行,看起来更清晰:

curl 'https://people-pa.clients6.google.com/v2/people/?key=REDACTED' \
-X POST \
-H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0' \
-H 'Accept: */*' \
-H 'Accept-Language: en' \
-H 'Accept-Encoding: gzip, deflate' \
-H 'X-HTTP-Method-Override: GET' \
-H 'Authorization: SAPISIDHASH REDACTED' \
-H 'Cookie: REDACTED'
-H 'Content-Type: application/x-www-form-urlencoded' \
-H 'X-Goog-AuthUser: 0' \
-H 'Origin: https://hangouts.google.com' \
-H 'Connection: keep-alive' \
-H 'Referer: https://hangouts.google.com/' \
-H 'Sec-Fetch-Dest: empty' \
-H 'Sec-Fetch-Mode: cors' \
-H 'Sec-Fetch-Site: same-site' \
-H 'Sec-GPC: 1' \
-H 'DNT: 1' \
-H 'Pragma: no-cache' \
-H 'Cache-Control: no-cache' \
-H 'TE: trailers' \
--data-raw 'personId=101777723309&personId=1175339043204&personId=1115266537043&personId=116731406166&extensionSet.extensionNames=HANGOUTS_ADDITIONAL_DATA&extensionSet.extensionNames=HANGOUTS_OFF_NETWORK_GAIA_GET&extensionSet.extensionNames=HANGOUTS_PHONE_DATA&includedProfileStates=ADMIN_BLOCKED&includedProfileStates=DELETED&includedProfileStates=PRIVATE_PROFILE&mergedPersonSourceOptions.includeAffinity=CHAT_AUTOCOMPLETE&coreIdParams.useRealtimeNotificationExpandedAcls=true&requestMask.includeField.paths=person.email&requestMask.includeField.paths=person.gender&requestMask.includeField.paths=person.in_app_reachability&requestMask.includeField.paths=person.metadata&requestMask.includeField.paths=person.name&requestMask.includeField.paths=person.phone&requestMask.includeField.paths=person.photo&requestMask.includeField.paths=person.read_only_profile_info&requestMask.includeField.paths=person.organization&requestMask.includeField.paths=person.location&requestMask.includeField.paths=person.cover_photo&requestMask.includeContainer=PROFILE&requestMask.includeContainer=DOMAIN_PROFILE&requestMask.includeContainer=CONTACT&key=REDACTED'

第一眼看起来内容有很多,但是现在你不需要考虑每一行是什么意思。你只需要把不相关的行删掉就可以了。

我通常通过删掉某行查看是否有错误来验证该行是不是可以删除 —— 只要请求没有错误就一直删请求头。通常情况下,你可以删掉 Accept*RefererSec-*DNTUser-Agent 和缓存相关的头。

在这个例子中,我把请求删成下面的样子:

curl 'https://people-pa.clients6.google.com/v2/people/?key=REDACTED' \
-X POST \
-H 'Authorization: SAPISIDHASH REDACTED' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-H 'Origin: https://hangouts.google.com' \
-H 'Cookie: REDACTED'\
--data-raw 'personId=101777723309&personId=1175339043204&personId=1115266537043&personId=116731406166&extensionSet.extensionNames=HANGOUTS_ADDITIONAL_DATA&extensionSet.extensionNames=HANGOUTS_OFF_NETWORK_GAIA_GET&extensionSet.extensionNames=HANGOUTS_PHONE_DATA&includedProfileStates=ADMIN_BLOCKED&includedProfileStates=DELETED&includedProfileStates=PRIVATE_PROFILE&mergedPersonSourceOptions.includeAffinity=CHAT_AUTOCOMPLETE&coreIdParams.useRealtimeNotificationExpandedAcls=true&requestMask.includeField.paths=person.email&requestMask.includeField.paths=person.gender&requestMask.includeField.paths=person.in_app_reachability&requestMask.includeField.paths=person.metadata&requestMask.includeField.paths=person.name&requestMask.includeField.paths=person.phone&requestMask.includeField.paths=person.photo&requestMask.includeField.paths=person.read_only_profile_info&requestMask.includeField.paths=person.organization&requestMask.includeField.paths=person.location&requestMask.includeField.paths=person.cover_photo&requestMask.includeContainer=PROFILE&requestMask.includeContainer=DOMAIN_PROFILE&requestMask.includeContainer=CONTACT&key=REDACTED'

这样我只需要 4 个请求头:AuthorizationContent-TypeOriginCookie。这样容易管理得多。

第四步:在 Python 中发请求

现在我们知道了我们需要哪些请求头,我们可以把 curl 命令翻译进 Python 程序!这部分是相当机械化的过程,目标仅仅是用 Python 发送与 cUrl 相同的数据。

下面是代码实例。我们使用 Python 的 requests 包实现了与前面 curl 命令相同的功能。我把整个长请求分解成了元组的数组,以便看起来更简洁。

import requests
import urllib

data = [
    ('personId','101777723'), # I redacted these IDs a bit too
    ('personId','117533904'),
    ('personId','111526653'),
    ('personId','116731406'),
    ('extensionSet.extensionNames','HANGOUTS_ADDITIONAL_DATA'),
    ('extensionSet.extensionNames','HANGOUTS_OFF_NETWORK_GAIA_GET'),
    ('extensionSet.extensionNames','HANGOUTS_PHONE_DATA'),
    ('includedProfileStates','ADMIN_BLOCKED'),
    ('includedProfileStates','DELETED'),
    ('includedProfileStates','PRIVATE_PROFILE'),
    ('mergedPersonSourceOptions.includeAffinity','CHAT_AUTOCOMPLETE'),
    ('coreIdParams.useRealtimeNotificationExpandedAcls','true'),
    ('requestMask.includeField.paths','person.email'),
    ('requestMask.includeField.paths','person.gender'),
    ('requestMask.includeField.paths','person.in_app_reachability'),
    ('requestMask.includeField.paths','person.metadata'),
    ('requestMask.includeField.paths','person.name'),
    ('requestMask.includeField.paths','person.phone'),
    ('requestMask.includeField.paths','person.photo'),
    ('requestMask.includeField.paths','person.read_only_profile_info'),
    ('requestMask.includeField.paths','person.organization'),
    ('requestMask.includeField.paths','person.location'),
    ('requestMask.includeField.paths','person.cover_photo'),
    ('requestMask.includeContainer','PROFILE'),
    ('requestMask.includeContainer','DOMAIN_PROFILE'),
    ('requestMask.includeContainer','CONTACT'),
    ('key','REDACTED')
]
response = requests.post('https://people-pa.clients6.google.com/v2/people/?key=REDACTED',
    headers={
        'X-HTTP-Method-Override': 'GET',
        'Authorization': 'SAPISIDHASH REDACTED',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Origin': 'https://hangouts.google.com',
        'Cookie': 'REDACTED',
    },
    data=urllib.parse.urlencode(data),
)

print(response.text)

我执行这个程序后正常运行 —— 输出了一堆 JSON 数据!太棒了!

你会注意到有些地方我用 REDACTED 代替了,因为如果我把原始数据列出来你就可以用我的账号来访问谷歌论坛了,这就很不好了。

运行结束!

现在我可以随意修改 Python 程序,比如传入不同的参数,或解析结果等。

我不打算用它来做其他有意思的事了,因为我压根对这个 API 没兴趣,我只是用它来阐述请求 API 的过程。

但是你确实可以对返回的一堆 JSON 做一些处理。

curlconverter 看起来很强大

有人评论说可以使用 https://curlconverter.com/ 自动把 curl 转换成 Python(和一些其他的语言!),这看起来很神奇 —— 我都是手动转的。我在这个例子里使用了它,看起来一切正常。

追踪 API 的处理过程并不容易

我不打算夸大追踪 API 处理过程的难度 —— API 的处理过程并不明显!我也不知道传给这个谷歌论坛 API 的一堆参数都是做什么的!

但是有一些参数看起来很直观,比如 requestMask.includeField.paths=person.email 可能表示“包含每个人的邮件地址”。因此我只关心我能看懂的参数,不关心看不懂的。

(理论上)适用于所有场景

可能有人质疑 —— 这个方法适用于所有场景吗?

答案是肯定的 —— 浏览器不是魔法!浏览器发送给你的服务器的所有信息都是 HTTP 请求。因此如果我复制了浏览器发送的所有的 HTTP 请求头,那么后端就会认为请求是从我的浏览器发出的,而不是用 Python 程序发出的。

当然,我们去掉了一些浏览器发送的请求头,因此理论上后端是可以识别出来请求是从浏览器还是 Python 程序发出的,但是它们通常不会检查。

这里有一些对读者的告诫 —— 一些谷歌服务的后端会通过令人难以理解(对我来说是)方式跟前端通信,因此即使理论上你可以模拟前端的请求,但实际上可能行不通。可能会遭受更多攻击的大型 API 会有更多的保护措施。

我们已经知道了如何调用没有文档说明的 API。现在我们再来聊聊可能遇到的问题。

问题 1:会话 cookie 过期

一个大问题是我用我的谷歌会话 cookie 作为身份认证,因此当我的浏览器会话过期后,这个脚本就不能用了。

这意味着这种方式不能长久使用(我宁愿调一个真正的 API),但是如果我只是要一次性快速抓取一小组数据,那么可以使用它。

问题 2:滥用

如果我正在请求一个小网站,那么我的 Python 脚本可能会把服务打垮,因为请求数超出了它们的处理能力。因此我请求时尽量谨慎,尽量不过快地发送大量请求。

这尤其重要,因为没有官方 API 的网站往往是些小网站且没有足够的资源。

很明显在这个例子中这不是问题 —— 我认为在写这篇文章的过程我一共向谷歌论坛的后端发送了 20 次请求,他们肯定可以处理。

如果你用自己的账号身份过度访问这个 API 并导致了故障,那么你的账号可能会被暂时封禁(情理之中)。

我只下载我自己的数据或公共的数据 —— 我的目的不是寻找网站的弱点。

请记住所有人都可以访问你没有文档说明的 API

我认为本文最重要的信息并不是如何使用其他人没有文档说明的 API。虽然很有趣,但是也有一些限制,而且我也不会经常这么做。

更重要的一点是,任何人都可以这么访问你后端的 API!每个人都有开发者工具和网络标签,查看你传到后端的参数、修改它们都很容易。

因此如果一个人通过修改某些参数来获取其他用户的信息,这不值得提倡。我认为提供公开 API 的大部分开发者们都知道,但是我之所以再提一次,是因为每个初学者都应该了解。: )


via: https://jvns.ca/blog/2022/03/10/how-to-use-undocumented-web-apis/

作者:Julia Evans 选题:lujun9972 译者:lxbwolf 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

号称“首个中文编写的操作系统”被质疑

根据开发者 Jason.Shao 略带调侃的介绍,“火龙操作系统 是全宇宙首个采用中文编写的操作系统”,使用自创的甲语言,乙语言开发,可以自举编译。支持 64 位多核多任务图形化,采用分页式内存管理,支持 x86\_64、ARMv8(仅 QEMU 测试)架构。采用 Windows 11 界面风格,支持 32 位真彩显示,分辨率可达 2560x1080。支持 300 个常用 Win API,支持部分 exe 程序。硬件方面支持 USB、声卡、网卡等,甚至支持 Intel 11 代酷睿的 Tiger Lake 核显。

但在该项目的 Gitee 页面有人指出,“这个就是日本人川合秀实《30天自制操作系统》里的‘纸娃娃操作系统’,所谓的‘甲语言’其实就是 asm 汇编语言,使用了拙劣的文本替换方式,把诸如 mov 这样的指令用蹩脚的‘移送’来替换……‘乙语言’就是 c 语言。”作者回复称,“请你仔细阅读 30 天自制操作系统的开源协议再来吐槽,作者明确说明了代码可以随意修改,修改后的代码也不必开源,拿来商用都是可以的,关于本项目之后的代码都不在开源!”

老王点评:实在槽点太多,大家请随意吐槽。

福特计划销售缺少部分芯片的 SUV

这些芯片为后排空调和加热控制提供支持。福特将在一年内向经销商运送缺失的芯片,然后他们将为购买了这些车辆的客户安装这些芯片。福特说,空调和加热仍然可以从前排座位上控制,选择购买没有后排控制的车辆的客户将获得降价。去年,福特生产出来但缺少芯片的汽车堆满了停车场,原本计划向经销商运送部分完工的、不可驾驶的车辆,但现在,缺少部分芯片的车辆将既可驾驶又可销售。而其他汽车制造商也不得不因芯片短缺而做出牺牲,通用汽车放弃了无线充电、高清收音机和使一些皮卡更有效运行的燃料管理模块。

老王点评:福特真是个鬼机灵。

因为最近的“幽灵”漏洞,原定的 Linux 5.17 发布延迟了

Linus Torvalds 在今天的 5.17-rc8 公告 中解释说,由于新的变异的“幽灵”攻击和各种各样的其他修复,他觉得发布 -rc8 比直接发布最终版本更舒服。-rc8 补丁中大约有一半是架构更新。因此,Linux 5.17 现在计划在下周末(3 月 20 日)发布。这个新的幽灵漏洞影响到英特尔和 Arm CPU。

老王点评:这就是计划赶不上变化,新的 CPU 漏洞又得让各大操作系统忙一段时间了。