普通视图

发现新文章,点击刷新页面。
昨天以前时光的时光轴

扒拉IPTV源的不完全指南

作者 时光
2024年1月31日 00:00

又是年初的时候,某股神秘力量影响着我去改动家里的网络架构,前年这个节点我弄来了小米路由器 AX3600,去年弄来了J4125软路由,今年弄来了(某环大陆产品):

某环大陆产品

当然了,了解这款产品不是一天两天了,至于为什么会选择今年拿下...🤔我也不太清楚。 关于这款产品的测评介绍网上已经够多了,所以感兴趣的自己搜搜看咯。

但因为这款产品还是有当作电视盒子的需求在的,所以搞定电视频道的观看非常重要。

获得 IPTV 源

网络上有不少 IPTV 的现成解决方案,有的甚至集合了全世界范围数千个频道,也有那种有专人维护,比较稳定的付费源。

本来想着图省事要不直接用公开的源算了,转头想起之前家里办宽带送了一个 IPTV 盒子,迅速翻找出来、接网线、上电,别说,系统是垃圾了点,但是有我想要的 IPTV 资源在里面,开搞!

了解 IPTV 盒子的工作条件

经过一番了解,这个 IPTV 各家运营商都玩的挺花,有的还专门配发了VLAN来保证 IPTV 的体验,你首先要清楚你手上的 IPTV 盒子是否有基于VLANPPPoE或者其他方案的授权,有这些情况大概率你需要准备东西来做转发,否则无法在第三方 IPTV 软件中播放。

本文的实现对象是是仅在获得流时需做一次性认证,所以算运气比较好😗,让我们继续吧!

抓包分析

首先我们得通过抓包来了解到 IPTV 盒子是如何获得直播流的。将盒子接入你所能控制的网络,这里你可以使用带抓包功能的路由,或者做网桥来实现,具体方法可以自行搜索。比如很好使的爱快自带的抓包工具:

爱快的抓包工具就很好使

将盒子关机后开始抓包,然后将盒子开机,随便播放几个频道,就可以停止抓包了,用 Wireshark 打开:

这么多包?我们直接找直播源,已知 IPTV 使用的流文件很大概率就是M3U,这个文件基于HTTP传输,所以直接过滤http包 +m3u字符串:

这么快找到一个,试着把这个 URL 直接在播放器中打开:

有效!那么接下来的工作就是往上翻阅请求,来看看这个流的 url 是怎么出来的。

这个就是我手头设备大概的请求流程,由于内容格式并不是 IPTV 播放器所能直接理解的订阅格式,所以需要弄个东西来代替 IPTV 盒子完成请求,并转换内容为 IPTV 播放器所能理解的文件内容。

获取并处理 IPTV 信息

经过测试,请求运营商的 IPTV 服务器的来源必须是本地运营商的 IP,所以我们需要在局域网内安排一个设备来实现请求转发。

我一开始使用的是内网穿透 + 云函数的方案(🤨后知后觉发现这么复杂完全是脱裤子放屁,可能我一开始打算在外网环境下观看吧...)

用 PHP 环境做了个简单的逻辑:

<?php

$server = "内网穿透好了的URL";
$channel = explode("/channel/",$_SERVER["REQUEST_URI"],2);

header('Content-Type: application/vnd.apple.mpegurl');
header('Expires: 0');

if(count($channel) != 2){
    exit(make_m3u());
}
get_stream($channel[1]);

function make_m3u(){
    global $server;
    $file = "#EXTM3U".PHP_EOL;
    $endpoint = "获得频道列表";
    $params = [
        认证信息
    ];

    $list = file_get_contents($server.$endpoint."?".http_build_query($params));
    $list = json_decode($list,true);
    if($list['result']['reason'] != 'ok')
        return 'fail';
    
    $list = $list['channelList'];
    foreach($list as $channel){
        $file.= "#EXTINF:-1 ";
        if (isset($channel['callsign']))
            $file.="tvg-logo=\"".$channel['callsign']."\", ";
        $file.= $channel['channelName'];
        $file.= PHP_EOL."解析频道信息URL".$channel['channelId'].PHP_EOL;
    }

    return $file;
}

function get_stream($channel){
    global $server;
    $endpoint = "获得直播源";

    $params = [
        鉴权及频道信息
    ];
    $ch = curl_init($server.$endpoint."?".http_build_query($params));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'X-Forwarded-IP: '.$_SERVER['HTTP_X_FORWARDED_FOR']
    ]);
    $response = curl_exec($ch);
    curl_close($ch);
    $stream = json_decode($response,true);
    if($stream['result']['reason'] != 'ok')
        return 'fail';
    
    header('Location: ' . $stream['playAddress'], true, 302);
}
?>

能正常解析并获得视频流。

但是我发现,这段请求在公网上绕了一圈,从家里回到家里... 速度太慢了,而且弯弯绕绕极其不优雅。

但我现在基本对家里供台服务器没什么兴趣了(可能已经退烧了),所以部署难度及复杂度上能低就低,所以继续动手优化这一过程。

先提一嘴反向代理遇到的坑

鉴权后返回的流 URL 是会带有一个userIp参数,这个参数经过实验,是获取自HTTP_X_FORWARDED这个HTTP 头,很不巧的是,这个头会被一些 CDN / 转发服务 / Web 服务器自动地加上访问者的 IP,本来是用于最终目的地好区分访问者真实 IP 的,结果到了鉴权这里就成坏事了。

要解决也很简单,我是用Caddy来实现反向代理,所以只需要加入一行配置:

header_up X-Forwarded-For {http.request.header.Fake-IP}

当然这里的名字你可以自己定义,在请求的时候携带Fake-IP这个头即可,避免了请求路径中有东西擅自给你加 IP😂

使用 Go 来实现处理的部分

直接上代码吧:

package main

import (
	"encoding/json"
	"fmt"
	"log"
	"net/http"
	"net/url"
	"strings"
)

const sourceServer = "视频流服务器"
const listServer = "频道列表服务器"

func main() {
	http.HandleFunc("/", getList)
	http.HandleFunc("/ch/", getChannel)

	log.Fatal(http.ListenAndServe(":80", nil))
}

func getList(w http.ResponseWriter, r *http.Request) {
	var data map[string]interface{}
	var list []interface{}
	var file strings.Builder

	file.WriteString("#EXTM3U\n")

	w.Header().Set("Content-Type", "application/vnd.apple.mpegurl")
	w.Header().Set("Expires", "0")

	params := url.Values{
		认证信息
	}
	resp, err := http.Get(listServer + "?" + params.Encode())
	if err != nil {
		fmt.Fprint(w, err)
		return
	}
	defer resp.Body.Close()
	json.NewDecoder(resp.Body).Decode(&data)

	if data["result"].(map[string]interface{})["reason"].(string) != "ok" {
		fmt.Fprint(w, "fail")
	}
	list = data["channelList"].([]interface{})

	for _, channel := range list {
		file.WriteString("#EXTINF:-1")
		if channel.(map[string]interface{})["channelName"] == nil {
			continue
		}
		if channel.(map[string]interface{})["callsign"] != nil {
			file.WriteString(" tvg-logo=\"" + channel.(map[string]interface{})["callsign"].(string) + "\"")
		}
		file.WriteString("," + channel.(map[string]interface{})["channelName"].(string) + "\n")
		file.WriteString("\nhttp://运行程序终端的IP/ch/" + channel.(map[string]interface{})["channelId"].(string) + "\n")
	}

	fmt.Fprint(w, file.String())
}

func getChannel(w http.ResponseWriter, r *http.Request) {
	channel := strings.TrimPrefix(r.URL.Path, "/ch/")
	var data map[string]interface{}

	params := url.Values{
		认证信息
	}

	resp, err := http.Get(sourceServer + "?" + params.Encode())
	if err != nil {
		fmt.Fprint(w, err)
		return
	}
	defer resp.Body.Close()
	json.NewDecoder(resp.Body).Decode(&data)

	if data["result"].(map[string]interface{})["reason"].(string) != "ok" {
		fmt.Fprint(w, "fail")
	}

	http.Redirect(w, r, data["playAddress"].(string), http.StatusFound)
}

这样,只需要把程序塞进一个简单的 Linux 环境内(我是直接丢 Docker 了),就可以让软路由运行转换服务器。

享受你的电视!

让网站实现简单反爬虫

2023年4月7日 11:26

说到爬虫,我认为大部分开发者都能充当矛与盾的制造者。

  • 那为什么要制造爬虫?让有价值的信息可被编程处理
  • 那为什么要对抗爬虫?让信息的价值尽量被所有者拥有

反爬虫#

除了对访问者进行一些基本的风控,你可能见过一些小众的反爬虫手段,比如:

字体动态渲染#

比如猫眼电影的案例

image

好好地数字查看源码确实乱码。这种属于后端动态生成一个字体,用于正确渲染数据供用户查看。

乱序段落渲染#

比如一个新闻网站的案例

image

字体不隐藏,但是将段落顺序打乱,然后前端通过计算data-s将正确的段落顺序还原出来。

这些反爬虫都是利用前端执行Javascript的能力,让用户能够正常阅读就行。
当然以上这些案例都有解决的办法,能够让用户方便阅读的,还原起来也不难。

所以现在更常用的手段应该是对访问 “用户” 做风控,来判断访问者到底是不是一个没有恶意的正常人

不过反爬虫手段也不一定是要阻止恶意手段来获取自己有价值的数据,比如:避免自动化获得我网站上的内容。

为什么要避免被自动化获得站点内容#

你见过这些吗:

image

图源:https://cloud.tencent.com/developer/article/1591533

或者是这些:

image

这我自己遇到的😢

你会很奇怪,我网址就是在即时聊天软件里面发一发,有的时候甚至都没发,怎么就被提示了?

因为有东西在不停歇地获取网站的内容,与关键词做匹配来进行一个简单的判断。

⚠️注意:这里不是教你钻空子,除了机器审核外,仍有人工审核的部分,不要存在侥幸心理。

那么我们的需求就很简单了,只要让通过非浏览器的方式(包括不开启Javascript的浏览器)访问站点的时候无法得到真正的网站内容即可。

image

比如Cloudflare提供的JS Challenge,就是一个很不错的案例,让用户在访问前先等个几秒钟。

不过这不是广告,如果优点很多就不会有这篇文章了,在国内套上 Cloudflare 后,就是减速器;你可能花了大价钱买的优质线路,走了它家的 CDN 后大家平起平坐(仅限免费版用户),一样缓慢。

但是不是全部的自动化检索内容的访问者的目的都是为了检查你网站有没有害,还有一个搜索引擎。所以我们也要为等待页做好 SEO,避免影响网站的搜索情况。

动手实现一个 JS Challenge#

JS Challenge 做了什么?#

要实现它之前,我们先了解一下 JS Challenge 做了什么:

  • 在访问网页时,判断用户是否已经被标记为合法,比如 Cookies 配合 Session 的数据,如果合法则直接渲染网页内容。
  • 如果不合法,则渲染一个等待页面,页面中包含加密的(也可以不加密)的 JS 代码,运算后能够得到一个唯一的结果,并将这个结果返回服务端与预先存储的结果比对,一致则标记为合法用户一段时间。

也就是说,一般的爬虫手段(比如直接模拟 HTTP 请求)是无法正常访问网站的,因为无法按预期执行 JS 代码。

那要实现一个什么东西?#

很遗憾,我并不知道搜索什么关键词,问 GPT 也只是在给我推荐网上现成的方案,搜索js challenge出来的都是编程题目...

所以我不得不想办法自己实现,我大概总结了目标程序要满足以下几个要求:

  • 一段计算要花时间的 JS 代码
  • 我需要在服务端提前设置答案
  • 答案唯一,且在前端不是那么容易被读取到

所以我扭头想到了一个东西:区块链,这里我就不过多提及了,虽然我要做的东西没有区块链这么复杂,但是有一个东西可能满足以上要求,那就是:算哈希

简单来说,哈希就是一个固定的算法,对唯一的内容生成出一个固定位数且唯一的字符串。如常用的MD5算法就是 32 个由0-9a-f组成的字符串。

开始实现#

设定目标#

那么什么样的事情能够让我在服务端提前得知,又没那么容易在前端得到答案呢?我的答案是:

服务端生成几位符合条件的字符串,前端通过暴力计算出末尾是我服务端提供的字符串,然后前端把字符串交给服务端计算哈希末尾是不是刚刚下发的字符串。

那么用什么方法来计算哈希?JS 有一个对象Crypto,浏览器兼容性如下:

image

那就用这个来实现吧。

image

主打的就是一个不实测就相信

验证算法#

当然SHA-1是一种不安全的加密算法,所以我要求 GPT 生成代码的时候总是警告我,不过好在最后还是给了我这么一段代码:

async function sha256(str) {
  const encoder = new TextEncoder();
  const data = encoder.encode(str);
  const hash = await crypto.subtle.digest('SHA-256', data);
  const hexHash = Array.from(new Uint8Array(hash))
    .map(b => b.toString(16).padStart(2, '0'))
    .join('');
  return hexHash;
}

async function findHashCollision() {
  const targetSuffix = 'fff';
  const maxLength = 10;
  const output = [];

  for (let i = 0; i < Math.pow(36, maxLength); i++) {
    const str = i.toString(36).padStart(maxLength, '0');
    const hash = await sha256(str);
    if (hash.endsWith(targetSuffix)) {
      output.push(str);
    }
  }

  return output;
}

findHashCollision().then(output => {
  console.log(output);
});

不过 GPT 还是很执着地给了我SHA-256的实现。他通过不断计算数字来完成碰撞,让我们稍作修改,然后在浏览器上试一下:

const encoder = new TextEncoder();
async function sha1(str) {
  const hash = await crypto.subtle.digest('SHA-1', encoder.encode(str));
  return Array.from(new Uint8Array(hash))
    .map(b => b.toString(16).padStart(2, '0'))
    .join('');
}

async function work(target) {
  const maxLength = 10;
  
  for (let i = 0; i < Number.MAX_SAFE_INTEGER; i++) {
    const hash = await sha1(i);
    if (hash.endsWith(target)) {
      return i;
    }
  }
}

work('fff').then(output => {
  console.log(output);
});

经过测试,找 3 位是一下就出来了,4 位差不多 1 秒,5 位有点为难人了,差不多需要 10 多秒。

那综合考虑就 4 位吧。

看看通用性怎么样#

仅仅测试ffff或者aaaa这样一样的字符串我觉得可能不够,那就试一下乱敲的:

image

9a9a的速度稍微慢了点,但也是差不多 1 秒左右。那就验证没啥大问题了:后端随机生成一个字符串,然后让前端碰撞出符合条件的数字。

先搞个好看的前端#

在真正访问到我们的站点前还是有一点点延迟,所以要整一个友好的等待跳转页面。

但是如果东西写多了可能还没加载完就跳转了,思来想去不如就模仿对着抄Cloudflare 的吧🤪

image

后端处理部分#

        $status = session('challenge');
         if($status === "pass")
             return $next($request);

         if(isset($_REQUEST['_challenge'])){
             if (substr(sha1($_REQUEST['_challenge']), -4) === $status){
                 session(['challenge' => 'pass']);
                 return $next($request);
             }
         }
         $challenge = substr(sha1(rand()), -4);
         session(['challenge' => $challenge]);
         return response()->view('common/challenge',['code' => $challenge]);

直接贴代码,实现上还是比较简单的。

再加一点细节#

当然,除了恶意的机器人,也有好的机器人,比如:搜索引擎

搜索引擎也是一种爬虫,并且人家也没有那么多资源来跑你的 JS Challenge,那怎么办?因为产品性质不一样,所以我只提及一点想法:

  • 把 JS Challenge 在 HTTP 处理的层次放到处理完页面渲染后,这个时候是能获得 SEO 信息的。
  • 放行搜索引擎的特征,不过有绕过的风险,不太清楚 Cloudflare 是怎么做的,有空研究研究。

所以在我的产品里,我通过 IP 数据库以及兼容 CF 传递过来的国家代码:

        if(isset($_SERVER["HTTP_CF_IPCOUNTRY"]))
            $isoCode = $_SERVER["HTTP_CF_IPCOUNTRY"];
        else{
            $reader = new Reader(storage_path('app/library/GeoLite2-Country.mmdb'));
            $isoCode = $reader->country($request->ip())->country->isoCode;
        }
        if($isoCode != 'CN'){
            session(['challenge' => 'pass']);
            return $next($request);
        }

这么处理一下,就能够达成这次的目标。

今天没有墨水,只想给你看看我的小猫🐱

2023年4月1日 16:31

这是我的小猫。
这是我的小猫。
她是我朋友在微信领养的,正巧她女朋友又捡到一只奶牛猫:

是只流浪了很久的小流浪
是只流浪了很久的小流浪

真的很乖,不知道是否是求生欲带来的亲人的性格,很自觉地往你身上靠,提起来的时候也会自己卷缩起来在你怀里。

这只奶牛猫取名叫华为,而我正好有条件养只猫,就把另外一只美短接过来养了。朋友给她取名叫苹果

纯瞎取名,朋友家里加上这两只捡来的一共四只猫,正好美短是美国佬,就想着叫苹果

至于为什么不选华为,可能我还是有点看脸在里面吧?

到家的第一个晚上
到家的第一个晚上

这是一只前主人抛弃不要的猫,所以到家后猫砂盆直接就会用。我感觉也有点以前养下来的习惯,比如:

  • 食物拿在手上不吃,怕咬到你
  • 喜欢给她买的窝
  • 剪指甲的时候还挺乖
  • 不把她逼急了不敢伸爪子和咬你
  • 挨打不会反抗

相处了一段时间,今天终于趁着天气好给猫自愿硬拉出门了。胆子还算可以,探索了一下很快会趴着享受阳光了。
IMG_0795.png
IMG_0792
谁能拒绝阳光下的小猫咪

IMG_0801
IMG_0803
小猪上树
IMG_0788
看不起长出来的猫草

相处了一段时间,这只猫只有一个特点看不起人,没别的。

零售啥的诱惑力度不大,猫薄荷也就第一次给她才如痴如醉,后面反应都很小了。我虽然是第一次养猫,但是感觉还是相处的过来,白天逼着不让她睡觉,陪她玩就行,不然晚上跑酷瞎叫真的熬不住。(第一天到家我困成狗了)

暂时,还是挺喜欢小猫的,想经常带出去变成社牛,到处溜猫。

哪有正常人买特斯拉的

作者 时光
2023年6月15日 00:28

⚠️ 前排提示,这是一篇发疯文

事情要从一个月前说起

5 月 16 号,我忘记是什么缘由了,突然想去试驾特斯拉,就迅速找了个有驾照的朋友问要不要一起去试驾。只能说刷了几年特斯拉视频还是有点作用,一股莫名的力量推动着我下载了Tesla App,然后又一股神奇的力量让我把双眼睁大,盯着Face ID,只能感受到微微的震动,然后 -1000
image

过了一会,从这条消息开始,我就开始发疯了 😵‍💫
image

日常到处搜集信息

为了缓解漫长的等待周期,自然是要在各种特斯拉相关 App,社交媒体上找车友群;这不找不知道,一找吓一跳,我每天接触到各种真真假假的信息,一感觉对我有利就马上丢群里去问:

运损车

image

有这么个事,这种要么被人先下手为强,要么变成官方二手;反正不太好弄。

不同城市之间交付速度差异

image

当时正赶上成都补贴,我是下定第二天知道的,不过销售直截了当地告诉我,现在下定拿不到。但是事实上我是感觉可以赌一把的,不过考虑到要先去成都提车然后板车再运回来,实在是折腾,就干脆躺平了。

结果成都交车那么快!!!特斯拉真的会把资源优先给补贴城市,只能说这么做很不错,优先考虑想要补贴的车主,但是湖南这边也.. 太慢了点(是湖南有钱人比较少吗😶)

轰炸四零零

image

最后还是 400 的同事联系到我交付这里来,打电话催也没用

总体来说,只有交付和销售的信息稍微靠谱点,其他车友的歪门邪道只能当心理安慰(或者他们真的凑巧就快提车了🥶)

发疯日常

image
image
image

熬到了头

虽然,我经历了大数据预期值落差:
image

这是第三方 App 的预计时间,非官方提供的时间,不过可以侧面映射全国提车的平均时间。(有地区在拉低平均数!!!)

也经历了大数据巨大落差:
image

到底是谁在提我的车??是谁???

但是最终,还是给我机会,让我给马斯克同志激情送金币!!💰
image

(这些钱每天放余额宝里面有 26 块钱的利息,每一天!😍)

感谢车友群发来的贺电 🎉
image

眼巴巴看他们讨论车好久了

终于见到了我的大鼠标

image
image

和老员工们合影!
image

发疯选号

自选是 50 次机会,咱就是说是不是我太挑剔了??
image

发疯,所有自选的都没中(这么多车我在想屁吃)
后面机选运气还不错,不带4,ABAB 尾号,就这样吧 🥱

抠搜的第一课

谁懂,大早上爬起来去薅早上的谷电(出租车司机太多了,23:00 根本等不到)
image

为了薅每周20-10的充电券

#发疯

image

别太过分...

我订车之前深圳就在搞补贴,但是因为销售和我说订太晚了可能没有。提车第二天又来 😠

内心 OS:没关系,到深圳还要板车回长沙上牌,板车还要钱,早买早享受了

谁家好人 1.2W 拿来早买早享受 🤬

就这样吧,和小特度蜜月了。

还有一件事

是的,如果你有想法,我眼馋你的引荐积分!我们可以有一笔交易 🤤

如果你需要试驾,也请让我推荐我的销售给你!(好人)

给网站加个“隐藏”水印

作者 时光
2023年6月3日 00:00

🥺 前排提示,受我自己的技术限制,本篇文章烂尾了

说到网站水印,也许你的第一反应就是那种侵犯隐私便于开发者追踪的盲水印
image

简单来说,可以通过使用人眼无法察觉的颜色变化,通过傅立叶变换在图片频谱图上叠加内容等方式在网站上或 App 里添加一些信息。这些信息会随着你发送图片而传播,并且一般抗干扰,意味着可以抵抗压缩,剪裁或其他图片处理的方式。

留在上面的信息一般也是与有关的,有说法说是说便于开发者追溯 BUG,至于追溯什么东西,DDDD

不过这次要实现的水印和盲水印不一样。

图片水印

image

你从大部分社交媒体上直接保存的图片,在右下角都会有这么个水印,一定程度上保护了版权,以及平台回流。更有甚者出现了多重水印
image

如果你在运营一个网站,你当然会希望自己的网站的每张图片都不会有 **“牛皮癣”** ,这也是为什么这个水印基本都在你主动进行保存操作下才会被添加上。不过美观归美观,有些想要借鉴你网站的人直接右键保存图片,转手到自己网站上了怎么办?

没办法从技术上拦截保存,又不好给每张图片都打上牛皮癣;那也试着模仿一下盲水印来搞定网站上的图片怎么样?

颜色上的互相抵消

我们的目标很明确:图片上有水印,下载下来能直接看见,但是在网站上显示的时候却看不见水印。

那我们只要实现一个叠加图层,这个图层叠加到有水印的图片上时能抵消掉图片上水印的颜色即可。那么也许你能够想到一个概念:互补色
image

这个是色环,对边的颜色等量混合起来会出现褐色或灰色。不过我们网页可不是用的颜料,而是RGB。那么在 RGB 中互补色的定义很简单:两个颜色的每个颜色通道加起来是255,即为互补色。也就是说:

  • 红色(255, 0, 0)的补色是青色(0, 255, 255)
  • 绿色(0, 255, 0)的补色是洋红色(255, 0, 255)
  • 蓝色(0, 0, 255)的补色是黄色(255, 255, 0)

RGB 互补色

根据这个规则,我只需要两个颜色的文本图层叠加起来就行:

image

可惜电脑上的颜色和颜料又不一样,我们需要把在上层的绿色的透明度设置为 50%,以混合洋红色,得到了一个偏中性的灰色
image

但是转头一想,你会发现,还有一个洋红色的透明度是 100%,那洋红色底下的内容总不可能凭空脑补出来吧?所以我们相对的还要调整洋红色的透明度。调整到洋红色 50%,绿色 32% 左右,会得到一个还不错的效果。

但是,灰色并不是我们想得到的结果啊?这样的水印还是很明显:
image

所以要依靠一个新东西,图片混合模式。把绿色使用叠加模式,然后调整两个颜色的透明度,你便可得到一个不错的效果:
image
image

那这样算成功了吗?别急,我们的图片总不可能都是黑色的吧,给这张图片点颜色瞧瞧:
image

额... 这样就得到了非常炸裂的效果 😢

彩色图片下的叠加模式

彩色下的颜色模式还真不好折腾,试来试去得到最好的结果也只有这样:
image

查阅了一圈好像确实没办法仅通过颜色叠加的方式来达到我的理想情况,不过缩小试试看?
image

好像只要不仔细看,这个色差确实不太容易引起人眼察觉。那咱就换个思路,把这个水印做大,做细,让色差范围不连片。但是很遗憾,效果还是不行:
image

这个办法对底色要求很严格,底色也会影响互补色的混合,导致在灰色上的水印会尤其明显。

这个方案仅适用于纯色图片,可能与彩色图片无缘了。那想一想其他办法?

图片处理模式上下手

虽然就我的理论上来说,没有好办法实现颜色相互抵消这种事情,那我增加借鉴者偷图片的复杂度总行了吧?看一眼图像调整的菜单,处理后能够还原图片信息的,似乎只有反相替换颜色这两项。
image

反相

这个我感觉是最好实现的,但是也是最容易被还原的办法。要实现起来很简单,网站侧一句 CSS 就行:

filter: invert(100%);

image

但是只要稍微接触过图片处理的人就会知道碰见这种图片应该怎么做 😂

还记得之前研究过的反爬虫吗?有些网站会通过动态生成字体来替换文字实现程序输出的和浏览者看到渲染之后的样子不一样;那么实现一个颜色表进行替换怎么样?

替换颜色

要想在网页里实现对图片的颜色替换,需要用到canvas。但是万万没想到,canvas 2D 的getImageData方法竟然可以实现跨域获取敏感数据:
image
image

那就很糟糕了,虽然我们的目的无害,但是如果要将这个办法通用开来,有跨域问题的存在体验会很差

难道没有别的办法了吗?这时我又想到了 CSS 中强大的filter

filter 属性

除了用invert函数进行反相,私护还有一个hue-rotate调整色相的函数也不会丢失图像原来的色彩信息。

但我经过简单的实验,你会发现,在 PS 里和 CSS 里对色相的调整竟然出现两种不一样的结果!?
image

我在浏览器里无论怎么调整,都无法得到一样的结果... 那是Safari的问题?也不是,Chrome得到了和Safari一样的色彩表现。那就很奇怪了

两边调整色相到底有什么不一样?

首先,hue-rotate是旋转色相,为什么是旋转呢?
image

让我们回到这个色环。你可以看到这个圆圈,有360度,所谓的旋转,就是颜色从某个点旋转多少度到目标颜色。比如,位于0度红色偏橙色,旋转90度就变成了黄色,旋转360度就变回了红色偏橙色

那我试试直接在两边调整色环不就能看出差别了吗?
image

这一试,我们得到了三个关键信息:

  • 两边调整色相都是在旋转色环,你可以看到在色系上,两边颜色映射是对的。
  • 有一边对于部分颜色的处理上有差异,在 PS 里似乎丢失了较多的颜色信息(绿色的三个块快成一块了)
  • CSS 处理上也丢失了颜色信息
    image

😅 这就很尴尬了,如果是旋转的话理论上不会丢失颜色信息啊,但如果情况是这样的话,hue-rotate就不能拿来用了。

灰溜溜收场

颜色上我做了很多尝试,目前除了最简单的反相确实没有什么很好的解决方案。但是我认为颜色替换是一个很有意思的想法,也许有空可以做一个 demo 实现一下。但是抛开跨域问题,性能上我觉得也会是大问题(毕竟是逐个像素的操作)加之 JS 部分肯定是需要混淆处理的。

那最好的解决方案其实还是加大水印🤔️ 另外一些小儿科的方法(禁止右键,防盗链之类的)就实在是防君子不防小人了。

最后再来一张用 Python 处理旋转色相的图片
image

我真的不理解... 为什么会这样...

罗湖的另一头是什么?

作者 时光
2023年5月5日 22:21

在放开后的第一个小长假里,作为特种兵当然不能缺席。前段时间也是在观摩各路大佬开海外银行账户的战绩,而正巧友人也询问了我的目的地,一拍即合,便计划上了去香港

由于一些客观原因,香港是我一个人去的,也许会有更多我主观的体验可以与你分享。

出发

我们主打一个不要命乘坐动车前往深圳,10 多个小时的车程,硬座。

响应 “青春没有售价,硬座直达拉萨” 的号召

虽然因为平时半夜就不怎么困,但是硬座坐起来实在是屁股疼,如果不是坐窗边都没有地方靠着。(坐过道的也可斜过身子靠左后背,但是中间的就很惨)脖子上挂着个昏昏欲睡的脑袋实在是不舒服。滑下身子找个舒服的姿势眯一会,醒了刷一刷手机,直到看到第一缕阳光洒在深圳的建筑上,这十多个小时算是到头了。

59046A02-8385-40DF-9574-C683AEF7482C_1_105_c

下车后因为订的民宿还不能入住,我们寄存了行李,便陪着我去找银行换港币去了。但是由于当天是周六,忘记了银行也要放假,便跑了两个中行才看见一份五一期间还营业的银行名单,便坐车过去了。

如果是中国银行,可以在 App 上用结汇购汇换港币,在香港找中银的 ATM 来直接取现。

C96DA207-B689-474A-8E43-46E16AA4297D_1_102_a

换了 1000 港币,真别说,拿到手上就感觉很不一样。

  • 发行方式好像不是以货币而是兑换券,这个可以在网上搜到更多信息
  • 香港的大部分银行都发行了通兑券
  • 面额最大有 1000 的
  • 汇丰的狮子真的好看!

能不能不换现金

不能,但是我换现金也只是为了充八达通,可以不用,但是你至少要有办法充八达通。现金还可以拿来充值其他的支付方式,比如Alipay HK

虽然支付宝的汇率会更好一点,但是不仅是八达通基本到哪都能用的属性,而且我也老早想体验这种一卡通了。不是说二维码支付不行,只能说近场通信天下第一!!

现在数字人民币我感觉就是这种模式,希望尽快普及。

入港

真不夸张,到了香港我花了将近 2 个小时才出地铁站....

一方面是震惊我从罗湖到西九龙是怎么消费 44.5 港币的,一方面就是离开了地铁 Wifi 我就是原始人。

image

我没有提前买流量包,因为我知道我自己要搞个香港手机号,所以在西九龙搞定了香港有礼后,跑了三个地铁站的 711 才买到想要的这张Club SIM

F4D7D283-D509-4858-893F-5C63D639552E_1_105_c

58 港币,送 20 的 711 代金券,38 港币,养号 6 港币一年,有什么理由不选?

香港有礼

这个是老早就刷到的活动了,本人不要脸的排了好几轮队,领了好几张(捂脸)不过每次领取需要绑定一个微信号 + 手机号。

我领了两张全日通(正好给我玩两天),一个餐厅的代金券,还有一份商店的代金券来买礼物。感谢香港旅游发展局,爱了😍

C98D2679-2E0C-482E-A5E5-2151B88AC686_1_105_c

到香港喝的第一口水,虽然这个内地也有,但是就是很爱喝哈哈哈哈。

中环

人在西九龙出了地铁,瞎逛,进商场实在是吓人,实打实的乡里别进城😂

看到 Apple Store 巨有钱,包了商场整个风景好的一边:

D571346B-9446-4E03-B8C9-E43C277491FC_1_102_o
在里面看外面,嘎嘎好拍:

3D2DBCB1-7F2F-4A44-9DAF-FBE10D07EEA6_1_102_a

D1FC7971-E032-4BCC-9F87-8184CB7CD59B_1_102_a

这边真的给我一种这是两个世界的冲击,在内地去大城市都看见差不多的东西,差不多的设施,差不多的长沙臭豆腐隆江猪脚饭浏阳蒸菜重庆火锅...

在香港大部分基础设施长得和内地都不太一样,也包括我与本地人沟通上还是有点障碍,总之和我去其他城市旅游是很不一样的感觉。

2D544FAF-9374-4334-9B11-5504672D1E18_1_105_c

关于吃

999B0183-6E97-4A15-A7F2-DDAEB6BF9131_1_105_c
如果出去玩我没想好吃什么,那么就吃麦当劳,不过这里的酱料竟然是收费的,1.5 港币一个,不过口味比国内丰富,但是都不怎么好吃。(蒜蓉辣椒酱永远的神!每次吃麦当劳我都会消耗两个以上)买了些酱带给朋友们尝尝。

08DDC8B0-D69C-4C2A-8601-EECF8605FE79_1_105_c
内地吃不到但是血贵的三件套,我吃的应该是香菇安格斯?不太记得名字了,挺一般的,加了酱也救不回来。
9619BFF4-CE11-4CA3-8BB1-38B2E1173BDF_1_105_c
薯条我不知道番茄酱是不是免费的,反正没有主动拿给我,我就点了份大套餐(看见送一包蜂蜜 BBQ 调味粉),吃起来和内地差不多。

AFCF11D0-0793-42E1-93E3-3BCCF0D656C4_1_102_o
13$ 的雪糕,*** 为什么会这么贵???比蜜雪冰城小,味道还差不多....

58260FF6-5AA9-489B-96A7-3DD1E7B006A5_1_105_c

C1CBC272-507D-4251-9E2D-81AD0EA603B1_1_105_c
用消费券吃的一餐冰室,券后 5$,爱了爱了。点菜由于看不懂,全靠价格和很小的图片瞎猜。口味其实还蛮不错的,就是消费实在是太太太太高了... 这一顿换算过来也要 80 多,如果是这些菜品的话我不是很能接受。

第一个多士我没看懂,结果上来一份烤过的吐司,然后配了一个安佳黄油,不知道怎么吃,就盖着鸡蛋直接吃了,黄油有点腻😂

2187AF77-49A8-469F-B64A-59995034DBDE_1_102_o
香港最便宜的饮料当属麦当劳,其他的价格实在是高攀不起,我也懒得排队

新注册麦当劳香港可以 1$ 喝一杯!

关于海

56593BF0-3246-4BB5-A456-690814031286_1_102_a

7F98DF75-9678-43B1-B94A-E78C40071010_1_102_a

70E426DB-56CF-4B7C-A428-14E9F3A3B4F3_1_102_a

DFA51F2E-266E-425A-B0A6-154F14980F6B_1_102_a

坐到杏花新城,这边鲜有游客,可以坐在公园上的长椅静静看海。

说到这个,因为有全日通,而且没有定目的地,所以我埃个地铁站坐下去看一看🤦

关于建筑

3C3EEAE6-5544-4B7B-9F81-8AB6DA0FDCF7_1_102_a
打卡高等学府!

9A825686-373B-4CEF-9FAD-029149CC1C44_1_102_o

这边建筑都很高,风格还挺有特点的。

29CC7E6C-49B2-4F6A-9B43-BA381EDD2686_1_102_a

土狗🐶勿进,巨奢华。

8F1042D1-1104-4EB2-829B-2069AF244AA7_1_105_c
Apple 铜锣湾

B6F0032A-2193-4A8C-BF30-F2D361E30C74_1_105_c
港片经常提到!看到就拍下来了。

BBC0DF57-31A8-4E42-A5A6-C6DBF85231C9_1_102_o
门口全是劳(吃麦当劳的什么时候能开上劳?有钱人多我一个怎么了?😭)

关于特产

当然不能忘了来香港的目的:

FA822297-8886-44C6-930D-1830528AD5F1_1_105_c
我都还没到家,实体卡先到了。不过这个自定卡号,因为我执着想要8888尾号,把次数都用完了都忘记选一个自己喜欢的😭所以是个随机卡号的卡。

30DE80F6-2E65-4C00-BB78-3CA5CD3F212C_1_105_c
顺手开了八达通的万事达,现在开通有点麻烦,不是很好入金开卡,不认证的话只能用转数快。

提一下转数快这个东西,巨方便!随便跨行,而且可以用手机号 / 邮箱作为转账依据,巨方便!

关于歧视

部分年长一点的本地人对讲普通话的歧视会有一点,比如我在时代广场遇到的:

当时想找 711 给 Alipay HK 储值,打开苹果地图一搜,发现 711 竟然在建筑里面,便去找商场的服务人员问,看起来是个大叔,他告诉我:711啊,711当然在7楼啊,你走那边扶梯上去就行

C3246C93-3CC5-4086-B66E-3B0F75BA3E79_1_105_c

他都不和我说其实有直梯,然后我当时对 7 楼有便利店的说法是不信的,虽然但是有钱还是怎么着,开在商场里面是什么操作?但是 ** 苹果地图确实是有一个 711 在建筑内,便信了他的鬼话上楼找了个直梯上了 7 楼找了好几圈。

当时已经是下午,特种兵已经步行了 2 万多步了,但是后来没找到回去的路,加之确实累了,不然我找到这人高低要骂一顿。

其他地方都还好,除了有些人听不太懂普通话,可以适当用英语消除歧义。

049849E4-11B4-4B35-A7BC-AC2568CFB824_1_105_c
回深圳咯!

我在香港玩了两天,都是当天去当天回深圳住下来,所以住宿还挺便宜的。整体的体验还是很不错的,就是时间短了点。如果愿意当特种兵,至少需要 3 天,如果想慢慢看,至少需要 5 天。

由于我八达通还剩 200 多,现金还剩 500,所以今年这个香港一定会再见面的。(自己找的理由)

获得了$MIRA?教你怎么换!

作者 时光
2023年4月21日 11:35

当你在通知里面看到了这样一条消息:
iShot_2023-04-21_11.38.03
那么恭喜你🎉,你的文章得到了他人的认可,希望你能继续产出优秀的内容。

那么怎么将这份激励换成画得出去的币呢?

将 MIRA 从 Crossbell 网络转移到 Polygon 网络上

访问 https://mira.crossbell.io/ ,在右上角登陆你使用 Xlog 的钱包,然后页面中间选择SWAP OUT

image

如果你在使用手机上的钱包,请你持续打开 App,因为接下来需要签名几次请求。

然后点击Swap $MIRA,你的 $MIRA 将由你确认并进行以下步骤:

  • 如果你当前钱包没有在 Crossbell 网络,将会要求你切换
  • 授权足够数量的 $MIRA 给 SWAP 服务
  • 自动进行兑换
  • 告诉你需要在钱包里从 Crossbell 网络切换至 Polygon 网络
  • 将智能合约兑换后的 $MIRA 发放到你钱包在 Polygon 网络上的账户

😀 如果你是第一次兑换 $MIRA 或者之前没有使用过 Polygon 网络,你可能缺少 Polygon 交易所需要的代币MATIC
在这篇文章下留言告诉我,我会查看你的 Xlog 是否有收到过打赏,如果是并且你的地址没有MATIC余额,我会为你的账户赠送免费的0.2MATIC,这能够让你完成第一笔交易。

😟 再说一点,区块链上的交易所需要燃烧的 GAS 费是动态的,如果你发现要进行的交易费很高,可以过一段时间再试试。

将 $MIRA 兑换成稳定币

将 $MIRA 与稳定币兑换可以让 $MIRA 的价值稳定一些,不然有可能出现刚兑换完价值就跳水的情况(

访问 UniSwap,右上角设置有中文。

image
然后在页面中间选择一个想要兑换的目标代币:

image
如果你不知道换哪个,就选USDC,手续费较低,稳定币,也好卖。
iShot_2023-04-21_13.02.03
打开你的钱包,点击这个红色的按钮,稍等一会,然后授权即可,你就会在你的钱包里看到刚刚兑换好的币种。

🫨 记得留一点 $MIRA 换点 MATIC,不然下次又转不了了。

将稳定币换成钱

如果你并不喜欢区块链,只是想把这个币变成可以花的钱,那么请继续:

注册一个交易所(链接含 AFF)

通过正规交易所交易法币需要实名认证。介意的话只能自己想办法了。

两家都是做的比较大的,随便选一家注册就行。

将币种转入钱包

打开交易所,以币安为例:

image
选充值,币种选择你刚刚兑换的币,比如USDC,然后网络只能选择 MATIC

image
复制地址

image
打开你的钱包,选择发送或叫转账,将所有代币转账给交易所给你的地址就行。

注意⚠️最小充币数量!

Polygon 网络因为设计的不同,到账速度会慢一点,需要确认至少达 300 个区块才可以交易,最长等待时间可能会有一个小时,请耐心等一会。

先兑换成 USDT

因为我拿来做演示的币安只有USDT没有USDC做 C2C 交易,所以还需要提前兑换一下。

如果你的交易所支持那更好。

image

C2C 交易

当你的代币成功充值到交易所后,就可以在交易所找到C2C或者就叫买币

image
选择卖出,然后法币选CNY,金额按1:7估算一下
image

然后找一个你支持的收款方式,以及汇率不错的商家,跟着他告诉你的方法交易就行。

你会发现这$MIRA¥CNY,环环相扣,层层扣钱🥲

Crossbell 的币到 Polygon 网络报错怎么办?

你看就没有好好读我的文章🤬

我会为你提供一点免费的 MATIC 用于交易,再详细说明一下:

领取内容

0.2 MATIC,用于帮助你在区块链中完成 Polygon 网络的交易。

如果这 0.2 不够,有可能是你兑换的时候网络太忙了,出现了很高的 GAS 费用,休息一会。

领取条件

  • Xlog 用户
  • 你的 Xlog 有发送内容,并且有人打赏了你
  • 你的钱包在 Polygon 网络上从来没有过交易
  • 在评论区扣 666告诉我

其他事项

理论上,只要我还没有申请破产,还在 Xlog 上持续输出内容,这份爱心我可以一直发放下去。

最后,一起持续输出优质内容吧😄

怎么之前的数据都没了?因为我把阳寿燃烧了一点。

作者 时光
2023年4月21日 11:24

更新:永远喜欢有社区感的产品。感谢@DIYgod@Songkeys两位。

iShot_2023-04-21_19.18.35

以下为原文,不过你还是有必要看看我的靓号的😋


几天不见,怎么好像数据清空了?之前的关注和阅读数据都没了?

iShot_2023-04-21_09.58.07
这是迁移前的数据,来到 Xlog 正好一个月啦!,虽然不知道浏览量以什么标准计算,数据上有 2.4W 次,也感谢 68 位小伙伴的关注!

那为什么要更换?

因为 Xlog 把我步入区块链的门给开了。🌝

这段时间一边因为在使用 Xlog 中偶尔会遇到一些和平常写博客不太一样的情况,比如说为什么写东西需要 “代币”,为什么扣代币的时候还要 “燃烧”,为什么 “燃烧” 的代币有时多有时少?

另一方面就是也收到了加密货币的款项,本着经济的角度自然会好奇怎样转账最划算,为什么会有这么多网络,为什么在不同的网络上有一样名字的代币?

😫问题太多了,在一开始,我只是关注明面上的数字,以及抱怨为什么挣点钱转账还要交税扣钱。再后来我就关注到了 “靓号” 这个东西,和 QQ 号差不多的概念,只不过,区块链的靓号只属于你

所以你可以看见现在博客的所有者是:

0x8888178158dc63cfc24df6a0a95a9279c9388888

算靓号!

这是我用我电脑计算出来的,当时就是想试试算力,随便设点规则试试,结果没几秒就出来一个:足足9 个 8的地址。

我开始还寻思:怎么?以太坊地址这么好算?然后再开始算刚刚的规则,事实告诉我,估计要一会才能出来了。(这波运气拉满)

以太坊地址有 40 个字符,16 进制表述,每个字符都有 16 种可能,9 位有 16^9 种组合,也就是最多计算 68,719,476,736 次,按我的电脑算力 1MH/s,大概需要 19 个小时。

你可能会觉得,那也还好啊?可能这是我几秒钟爆出来的吧,我没有这个耐心烤机 19 小时🤪。不过 9 位 19 个小时,10 位呢?难度是指数级增长的,也就是在 4MH/s 左右的算力情况下,需要:

Generating ETH Address
Difficulty: 281474976710656
[4.69 Mkey/s][total 5473792][Prob 0.0%][50% in 1.3y]

程序告诉我,我有50%的可能性在 1.3 年内拿到我想要的靓号。那么最长可能是?
iShot_2023-04-21_11.02.53
按 1MH/s 算,需要 8.9 年。

计算算力不一样是因为如果需要计算尾号,需要使用正则表达式,速度会慢几倍,大约在 1MH/s 左右。

我是一开始是拿 M1 算的,那我在想,这 4+4 核心都能算这么多,那我找个性能 “猛兽” 岂不是能算得更快?

所以我找了一台 “猛兽”:

iShot_2023-04-21_11.09.34

结论是 32C = 8C,大力发展 M 芯片算靓号产业!!

有什么用?

看图:

image

iShot_2023-04-21_11.13.27

image
正如大部分算靓号项目都叫vanity一样,确实有点小满足。

image

还买了点 “域名”

又是老早就知道的.bit域名,奈何那时候确实是不是很相信区块链这种东西,压根没有闲钱投资这个... 不过还是跑了跑接口,拿下了几枚:

iShot_2023-04-21_11.17.09
配合跑靓号,装逼度拉满:

image

(你怎么整这么多花活但是钱包里一分钱也没有?)

那之前的数据怎么办?

因为去中心化的缘故,可能没有 “迁移地址” 这种说法,只能迁移我自己产生的内容上去了。这一个月以来的数据、评论、和关注都会走丢🥲

只能想着长痛不如短痛,不然这么好的地址在我手上又没人看见跑出来做什么用!!??😋

iShot_2023-04-21_10.30.23

刚迁移完文章,蹦出来 126 个阅读,还是有点高兴的😁

使用P12证书来为App签个名

作者 时光
2023年4月19日 11:25

这是一篇使用 P12 证书签名 App 的教程。

依据以下步骤来完成证书的使用:

开启开发者模式

如果你的手机系统版本更新到了iOS16.0,那么你需要在系统中打开开发者模式

开启路径是设置App 隐私与安全性 开发者模式

open_developer_mode-2.png

获得设备的 UDID

首先,访问获取 UDID,也可以使用移动设备扫描二维码:
image
打开页面将会要求你安装描述文件,允许,并在设置中安装描述文件:
image
稍等一会,会自动打开浏览器并展示你的 UDID:
image

请按如下格式发送给我:

UDID
设备型号
你的称呼

有多少台设备需要配置就获取多少台设备的 UDID,添加后不可修改,只可新增。
获取 UDID 后可以将描述文件移除,不会再用到了。

安装轻松签

在你提交 UDID 后,我会为你生成一份 p12 证书,并为你重新打包一次轻松签。,在告知你可以下载后,你可以点击链接下载,或者扫描二维码下载:
QRCode_336

稍等一会,你便会在桌面上看到下载好的轻松签

导入证书

image
打开轻松签,选择设置,导入文件。然后找到我发送给你的压缩包:

image
选择文件进行解压,依次选择两个文件导入:

image
回到文件管理

image
选择.p12结尾的文件,选择导入证书库,输入我提供给你的密码。

签名 App

.ipa文件导入轻松签,在应用选项卡里可以找到未签名的 App:

IMG_1043
选择你要签名的 App,选择签名,可以勾选签名后立即安装。其他的配置根据自身需求调整。

回到桌面,你会发现刚刚的应用已经安装完成了。

🎉开始享受吧!

你好乘客!👏欢迎乘坐Apple开发者的车

作者 时光
2023年4月16日 19:27

2023 年 4 月 19 日更新:

因为一开始在不同地方的乘客在签名时并没有要求双重认证,但是在登录账号后又陆续出现双重认证的情况,这让我不得不重视起来。

iShot_2023-04-19_00.00.53
因为一开始就发现登录时弹双重认证的 IP 并不是签名服务器的 IP,后面我尝试在反向代理层对传递的 IP 修改为我在国内的 IP,当时是呈现了我预期的效果:直接登录,两步验证弹国内地址。

我以为没问题了,结果后来我发现我无论如何调整反向代理部分的配置,弹双重的地点和我的节点都是一个地方😣

逐抓包,然后看了一下服务端的源码,发现服务端好像仅作为设备注册😭

所以 SideStore 方案暂时放弃了,更换成熟的 P12 方案了

以下是原文:

这是一篇提供给与我一起合租 Apple 开发者账号的使用向导,依据本文来携带设备上车。

开启开发者模式

如果你的手机系统版本更新到了iOS16.0,那么你需要在系统中打开开发者模式

开启路径是设置App 隐私与安全性 开发者模式

open_developer_mode-2.png

获得设备的 UDID

首先,访问获取 UDID,也可以使用移动设备扫描二维码:
image
打开页面将会要求你安装描述文件,允许,并在设置中安装描述文件:
image
稍等一会,会自动打开浏览器并展示你的 UDID:
image

请按如下格式发送给我:

UDID
设备型号
你的称呼

有多少台设备需要配置就获取多少台设备的 UDID,添加后不可修改,只可新增。
获取 UDID 后可以将描述文件移除,不会再用到了。

安装 SideStore

在你提交 UDID 后,我会为你重新打包 SideStore,在告知你可以下载后,你可以点击链接下载,或者扫描二维码下载:
image

稍等一会,你便会在桌面上看到下载好的SideStore先不要急着打开

配置配对文件

通过我预先签名的 App 安装的 SideStore 需要手动完成设备配对,这将会用来模拟电脑,相关细节这里不多提及。

此步骤需要一台电脑。

选择你的平台:

这里提供的下载是镜像,非实时更新。在下载后,解压,然后将你的设备连接到电脑上,信任电脑,然后运行解压出来的二进制文件。

运行成功后将会在你的运行目录下生成一个.mobiledevicepairing文件,将它通过隔空投送或者文件传输助手之类的方式,将它保存在文件App中。

打开SideStore,你将会收到提示:

image

选择OK,然后选择刚刚保存的.mobiledevicepairing。这样就完成了SideStore
的安装。

配置签名服务器

打开,设置,关闭Use preferred servers,在Aniserre URL中填写我提供给你的内容。

image

通过固定签名服务器,这将能够让大家使用同一台设备完成签名,减少设备登录的风控,以及不用两步验证

配置完成后回到SideStore,在 App 里的设置选择登陆,然后输入我提供给你的帐号及密码:
image

稍等一会,账号就会登陆上去了。

安装 Wiregurad

在 AppStore 中搜索 Wiregurad 安装(国区似乎不提供,后期有需求会提供签名分发)。

打开后,右上角➕号,扫描二维码:
image

来导入配置文件,取个名可以叫SideStore

若要开始安装 App,请打开隧道,不影响正常的网络:
image

安装 App

SideStore中,内置提供了一些软件源,如果你网络状况过得去,可以直接安装里面的软件。后续有计划自建一个。

如果你主要目的是签名 App,那么将 App 调出分享界面(比如在文件 App 中),选择通过SideStore打开即可。

image

如果你没有找到,请找到更多然后打开SideStore

你也可以打开SideStoreMy Apps左上角加号来选择 IPA 安装。

注意,由于签名的过程需要上传 IPA,而服务器速度没那么给力,在上传比较大的 App 时需要等候的时间会有点久。

如果进度条走完了,并出现一款新的Sideloaded的 App,那么恭喜你,搞定了!
image

在这之后,你需要安装新的 App 时,只需要:

  • 准备好 IPA
  • 打开 Wireguard,启动连接
  • 打开 SideStore,导入 IPA,等待安装完成
  • 关闭 Wiregurad,开始享受!😎

常见问题

Q:安装软件时需要像 AltStore 一样用电脑吗?

不需要,只有在第一次安装 SideStore 时需要使用电脑生成一次配对文件,在此之后可以完全脱离电脑使用。但是安装软件时需要连接到 Wifi(热点好像可行)

Q:相比于网上卖证书的,你这样有什么好处?

网上卖 p12 证书的,一个是自己签名门槛可能高一点点,然后对签名 App 的数量有一定限制,并且有被开发者个人撤销的可能。通过 SideStore,你能够在至多 10 台设备上安装想要安装的软件(不太清楚一个账号 App IDs 是否有上限,理论上能安装很多很多)

Q:共享账号不会导致账号被禁用吗?

通过使用同一个 SideStore 服务器,能够让所有签名及登陆操作都在同一台 “伪造的 MAC” 上,这样既不会造成登陆一堆设备,也不会造成 Apple ID 的使用 IP 到处飞。

又来一张新的虚拟卡,来自Onekey

作者 时光
2023年4月14日 19:21

🪧前排提醒:

  • 这是一篇推广文,没有接广告,但是我想要通过 AFF 来升级我的卡片
  • 卡片适用范围及优惠信息有时效性,仅为我当前体验做承诺
  • 如果你等不及了可以先注册一个

先说发卡方

和之前的 Depay 不一样,确实是没有听说过这个公司,但是这次虚拟卡平台来自OneKey,之前在 V2ex 上面有看到过他们的推广,是一家做硬件钱包的,做了好几年了。

再说这张卡有什么特点?

首先,它是张VISA虚拟卡

image
相对于我来说的特点,因为 Depay 开不了 VISA。

卡片消费划算一点

账户等级充值费率
Black 黑卡1.5%
Platinum 白金1.7%
Gold 金卡1.9%
Silver 银卡2.1%

这是 Onekey 卡官方给出的充值费率,乍一看好像怎么比 Depay 贵多了?

iShot_2023-04-14_19.35.49

iShot_2023-04-14_19.35.53
Depay 最高 2%,最低 0.8%,大部分人开的标准卡是 1.35%。
但是 Onekey没有虚拟币转法币的过程,而在 Depay 上是这样子的:
image
这里的兑换手续费是差不多是1-0.991%,也就是说,加上去之后,Depay 的标准卡使用手续费最低为1.8%, 标准卡为2.35%

虽然但是,讲究一个能省则省。

不过补充下,虽然现在 Onekey 还不支持 USDT 充值,但是有这样一句话:
USDC 按照 1:1 进行充值 USD。
USDT 按照实时汇率进行兑换充值 USD。
我不太懂为什么都是稳定币,有一个便宜些?(可能)GPT 给我的回答是:

image

大部分等级 0 月费

除了银卡,月费是 1 美元外,其他的等级都是 0 月费;Depay 有三种卡有月费,大部分人开的标准卡月费也是 1 美元。

实名是自动化的

这个怎么说呢,总感觉这种方式一定程度上不那么容易信息泄漏。

那缺点呢?

好,前面说了优点,但是人家也没有在做慈善,优点算是:硬要说也算的。

因为 Onekey 不同等级的费用还是有点吓人:

image
从左至右,等级以高到低。价格单位是美元。

除了 Depay 不能直接升级的黑金卡外,高级卡要 99 刀,Depay 只要 50 刀。

另外现在还不能账户间转账,代充没得搞头,现在最低充值需要 20USDC。

那充值上怎么说?

image
这是目前通过 USDC 充值支持的网络,因为我没有那么多网络去挨个看矿工费,用币安的手续费做个参考:

  • TRX 1USDC
  • ETH 4.5USDC
  • AVAX 1USDC
  • ALGO 1USDC
  • 即将支持的 Polygon 1USDC(为什么 USDT 只需要 0.23USDT)

太贵了!!什么时候支持 BNB 再说吧😭

总的来说,乘着这还是个在公测的服务,注册一个也没什么,感觉后期模式上会搞的比 Depay 好一点?

iShot_2023-04-14_19.51.19
现在注册需要邀请码,为什么不试试呢?
https://card.onekey.so/?i=DM9A9B

❌
❌