目前土区已经涨了 本来注册了Apple账号想用来充值gpt 就很难受 想的是直接转到美区价格稳定点 但是支付方式没有none 大佬们有没有什么方法呢? 7 个帖子 - 5 位参与者 阅读完整话题
如题,之前是使用的 opencode,自己简单写了一个 Agent,现在转到QoderWork,但是看官方文档没有找到添加 Agent 的功能,只有添加 Skill ,有师傅懂怎么添加吗 1 个帖子 - 1 位参与者 阅读完整话题
今天满屏的都是 Fable 5 的对比,claude真的确实强,是续订48月team,还是转到claude。主要是感觉现在gpt只有便宜了,gpt还和codex融合,跟claude学的。纠结中。。。。。 16 个帖子 - 14 位参与者 阅读完整话题
之前只会用多次“滑动到底”鼠标手势来跳转到最新回复,然后按标题回到顶部 直到我发现这块居然能点能拖 这个功能太难发现了吧,UI设计有很大提升空间 3 个帖子 - 3 位参与者 阅读完整话题
如题,有点鹅厂的股票,想将股票卖出转回内地的银行,有没有毕竟方便的方式,在内地就可以开通某个银行的储蓄账户,支持将钱转回来,不用肉身去香港开通
搞不懂,中国人还开不了hkd账号,我是想用fps转到wise然后换成u 18 个帖子 - 12 位参与者 阅读完整话题
github账户注册2年了,最近把编程环境转到vscode上之后想研究研究github,github里面有repository,project,package,我去搜了搜各自代表什么含义 但是如果不去把流程过一遍,理解起来会很抽象,我在vscode里面过了一遍提交和branch代码,但整体流程理解起来有一定难度,尤其是项目进度条和项目仓库,在真实业务场景中你们是怎么进行的呢,有推荐学习资料嘛 9 个帖子 - 8 位参与者 阅读完整话题
想把老号转到土区,没有苹果手机,不知道能不能用mac代替手机操作订阅这些 2 个帖子 - 2 位参与者 阅读完整话题
今天全都转到fiat24了,但是claude今天到期了,本来还想到seagm买的,结果无论是卡还是套apple pay都被拒绝,enaba又没有14900的 真的傻了 1 个帖子 - 1 位参与者 阅读完整话题
Bitget 钱包的fiat24 usd24 转到了 metamask 钱包 转不出去了 有大佬碰到吗 2 个帖子 - 2 位参与者 阅读完整话题
最近中转号池转到了云服务器上面,想着不能浪费的原则流量搭了一个梯子拿来当线路用,昨天开始号池里面的账号就是时不时就收到邮件封号,想不明白这个是什么原因导致的 1 个帖子 - 1 位参与者 阅读完整话题
发现我的team也转到月限了,但我想知道为什么周限变月限不好啊?不是不用等刷新了,一个月内随时用吗? 2 个帖子 - 2 位参与者 阅读完整话题
如题所示,CLI Proxy API,也就是 CPA,它是支持导出已登录的 Codex 凭据的,我们只要稍作调整即可适配到 OpenCode 上。 到 CPA 下载 Codex 凭据: 运行下面的代码,需要 Python 3.10+ 神秘代码: """Convert CPA/CLIProxyAPI Codex OAuth credentials to opencode auth.json.""" from __future__ import annotations import json import os import shutil import sys from datetime import datetime, timezone from pathlib import Path from urllib.parse import unquote, urlparse DEFAULT_PROVIDER_ID = "openai" REQUIRED_FIELDS = ("access_token", "refresh_token", "expired", "account_id") def mask_token(value: object) -> str: if not isinstance(value, str) or not value: return "<missing>" if len(value) <= 12: return "******" return f"{value[:6]}...{value[-4:]}" def normalize_path(raw: str) -> Path: text = raw.strip() if text.startswith("& "): text = text[2:].strip() if (text.startswith('"') and text.endswith('"')) or ( text.startswith("'") and text.endswith("'") ): text = text[1:-1].strip() if text.lower().startswith("file:"): parsed = urlparse(text) text = unquote(parsed.path or "") if os.name == "nt" and len(text) >= 3 and text[0] == "/" and text[2] == ":": text = text[1:] text = os.path.expandvars(os.path.expanduser(text)) return Path(text).resolve() def read_json(path: Path) -> dict: with path.open("r", encoding="utf-8") as f: data = json.load(f) if not isinstance(data, dict): raise ValueError("JSON 顶层必须是对象。") return data def prompt_credential_path() -> Path: while True: raw = input("请输入 CPA/Codex 凭据 JSON 路径: ").strip() if not raw: print("路径不能为空。") continue path = normalize_path(raw) if not path.is_file(): print(f"未找到文件: {path}") continue if path.suffix.lower() != ".json": print("请输入 .json 文件。") continue return path def parse_expired_to_ms(value: object) -> tuple[int, str]: if isinstance(value, (int, float)): number = int(value) expires_ms = number if number > 10_000_000_000 else number * 1000 dt = datetime.fromtimestamp(expires_ms / 1000, tz=timezone.utc).astimezone() return expires_ms, dt.strftime("%Y-%m-%d %H:%M:%S %z") if not isinstance(value, str) or not value.strip(): raise ValueError("expired 字段不能为空。") text = value.strip() candidates = [] iso_text = text[:-1] + "+00:00" if text.endswith("Z") else text try: candidates.append(datetime.fromisoformat(iso_text)) except ValueError: pass formats = ( "%Y-%m-%dT%H:%M:%S%z", "%Y-%m-%d %H:%M:%S%z", "%Y-%m-%dT%H:%M:%S", "%Y-%m-%d %H:%M:%S", "%Y/%m/%d %H:%M:%S", "%m/%d/%Y %H:%M:%S", ) for fmt in formats: try: candidates.append(datetime.strptime(text, fmt)) except ValueError: continue if not candidates: raise ValueError(f"无法解析 expired 时间: {text}") dt = candidates[0] expires_ms = int(dt.timestamp() * 1000) display_dt = dt.astimezone() if dt.tzinfo else datetime.fromtimestamp(dt.timestamp()).astimezone() return expires_ms, display_dt.strftime("%Y-%m-%d %H:%M:%S %z") def ask_yes_no(prompt: str, default: bool = False) -> bool: suffix = "[Y/n]" if default else "[y/N]" while True: answer = input(f"{prompt} {suffix}: ").strip().lower() if not answer: return default if answer in {"y", "yes"}: return True if answer in {"n", "no"}: return False print("请输入 y 或 n。") def default_auth_candidates() -> list[Path]: candidates: list[Path] = [] local_app_data = os.environ.get("LOCALAPPDATA") user_profile = os.environ.get("USERPROFILE") if local_app_data: candidates.append(Path(local_app_data) / "opencode" / "auth.json") if user_profile: candidates.append(Path(user_profile) / ".local" / "share" / "opencode" / "auth.json") return candidates def prompt_auth_path() -> Path: while True: raw = input("未找到默认 opencode 目录,请输入 auth.json 路径或目标目录: ").strip() if not raw: print("路径不能为空。") continue path = normalize_path(raw) if path.exists() and path.is_dir(): return path / "auth.json" if path.suffix.lower() == ".json": target = path target_dir = path.parent else: target_dir = path target = target_dir / "auth.json" if target_dir.exists(): return target if ask_yes_no(f"目标目录不存在,是否创建?{target_dir}"): target_dir.mkdir(parents=True, exist_ok=True) return target print("已取消使用该路径,请重新输入。") def resolve_auth_path() -> Path: candidates = default_auth_candidates() for candidate in candidates: if candidate.is_file(): return candidate for candidate in candidates: if candidate.parent.is_dir(): return candidate return prompt_auth_path() def load_auth(path: Path) -> dict: if not path.exists(): return {} data = read_json(path) return data def backup_auth(path: Path) -> Path | None: if not path.exists(): return None timestamp = datetime.now().strftime("%Y%m%d-%H%M%S") backup_path = path.with_name(f"{path.name}.bak-{timestamp}") shutil.copy2(path, backup_path) return backup_path def write_auth(path: Path, auth_data: dict) -> None: path.parent.mkdir(parents=True, exist_ok=True) with path.open("w", encoding="utf-8", newline="\n") as f: json.dump(auth_data, f, ensure_ascii=False, indent=2) f.write("\n") def validate_credential(data: dict) -> None: missing = [field for field in REQUIRED_FIELDS if not data.get(field)] if missing: raise ValueError("凭据 JSON 缺少必要字段: " + ", ".join(missing)) def main() -> int: print("Codex OAuth -> opencode auth.json 转换工具") print("安全提示: 本脚本只读取/写入本机文件,不会联网;token 只打码显示。") credential_path = prompt_credential_path() try: credential = read_json(credential_path) validate_credential(credential) expires_ms, expires_human = parse_expired_to_ms(credential["expired"]) except Exception as exc: print(f"读取或解析凭据失败: {exc}") return 1 provider_id = input(f"请输入 provider ID,直接回车默认 {DEFAULT_PROVIDER_ID}: ").strip() if not provider_id: provider_id = DEFAULT_PROVIDER_ID auth_path = resolve_auth_path() print("\n即将写入:") print(f"凭据文件: {credential_path}") print(f"auth.json: {auth_path}") print(f"provider ID: {provider_id}") print(f"access_token: {mask_token(credential.get('access_token'))}") print(f"refresh_token: {mask_token(credential.get('refresh_token'))}") print(f"expires: {expires_human} ({expires_ms})") print(f"account_id: {credential.get('account_id')}") if credential.get("id_token"): print("id_token: 已忽略") if credential.get("email"): print(f"email: {credential.get('email')}") if not ask_yes_no("确认写入?"): print("已取消,未写入任何文件。") return 0 try: auth_data = load_auth(auth_path) backup_path = backup_auth(auth_path) auth_data[provider_id] = { "type": "oauth", "refresh": credential["refresh_token"], "access": credential["access_token"], "expires": expires_ms, "accountId": credential["account_id"], } write_auth(auth_path, auth_data) except Exception as exc: print(f"写入失败: {exc}") return 1 print("\n写入完成:") print(f"auth.json 路径: {auth_path}") print(f"provider ID: {provider_id}") print(f"expires: {expires_human}") if backup_path: print(f"备份: 已创建 {backup_path}") else: print("备份: 未创建,原 auth.json 不存在") return 0 if __name__ == "__main__": sys.exit(main()) 按照提示输入 凭据文件位置 就好。 然后你的 C:\Users\用户名\.local\share\opencode\auth.json 大概长这样: { "openai": { "type": "oauth", "refresh": "", "access": "", "expires": 1780837337000, "accountId": "" } } 这个时候再 opencode , /models ,就会发现那个 OpenAI 官方标志的 GPT 5.5 了: 顺带一提,这是直接请求了 OpenAI Codex 官方的后端地址(Cloudflare CDN) https://chatgpt.com/backend-api/codex/responses : 2 个帖子 - 2 位参与者 阅读完整话题
公司提供了Github Copilot,里面有Claude模型 有没有什么办法可以转到CC用?Copilot里的模型支持1M上下文吗? 12 个帖子 - 9 位参与者 阅读完整话题
目前sub2api上有一些codex账号 怎么能转到cpa中去进行管理呢? 3 个帖子 - 3 位参与者 阅读完整话题
https://imgur.com/Efa7SXb
https://imgur.com/Efa7SXb
之前使用CPA,最近转到sub2api来了,发现在sub2api上这几天就刷新令牌失败的账户越来越多,之前CPA上面一周就死几个而已,这正常吗?我不理解,怕号死完了,是有什么配置出问题了吗,求佬们求救 4 个帖子 - 3 位参与者 阅读完整话题
报错如图 3 个帖子 - 2 位参与者 阅读完整话题
本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容: 我的帖子已经打上 开源推广 标签: 是 我的开源项目完整开源,无未开源部分: 是 我的开源项目已链接认可 LINUX DO 社区: 是 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是 以上选择我承诺是永久有效的,接受社区和佬友监督: 是 以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出 github.com GitHub - JeseKi/FeishuTuchuang: 将飞书云盘作为冷存储的飞书图床。 将飞书云盘作为冷存储的飞书图床。 起因 我之前一直使用的是 S3 服务来存储自己的图片这一类的文件,方便链接到各个地方。 但是后续发现这个东西得我一直进行付费…一年下来到现在已经快 30 一个月了。 这么下去可不得了。 而且在这些 S3 服务里,图片这一类东西是不允许直接在控制台里预览的,你的图片没有写清楚文件名就不知道里面是什么, 实际上是写了也会忘 ,加上如果真的手动命名文件再上传又显得麻烦。 一些图片没有引用了你也不好进行清理,它就一直占着你的付费空间。 因此预览这个功能也显得很重要。 一开始虽然想到了一些云盘之类的,虽然我确实是有一些云盘的会员,但是这些云盘的 API 实在是写的太差了,有跟没有似的。 因此最终还是找到了飞书这一块,将飞书作为图片的冷存储的话有下面几个优点: 免费空间足够大——单人 50G. 支持预览。 API 文档写的很详细,同时 API 的免费额度给的足够大方。 因此就做了一个这样的飞书图床出来,自己也用了一段时间,想了想开源出来也给大伙用用好了。 不过它运行时不是那种静态资源型的图床,飞书上面我列了这一堆优点,但是美中不足的还是它需要一个鉴权才能获取到图片内容,因此还是需要一个服务器来作为图片缓存+鉴权的。 QA Q: 为什么想到了使用飞书而不使用其他免费的图床应用? A:一个是隐私,有些东西还是不能随便外泄的,还有一个是那些免费的小平台你指不定什么时候跑了自己的图片全得玩完。 Q: 都上服务器了,为什么不直接用服务器的存储空间? A:个人服务器的存储空间是比较贵的,通常加上去了就不好卸下来,但是服务器的流量相对来说除了一些专门用来作为文件传输的服务器以外,用的不是很多,图片对服务器来说是一个恰到好处的流量消耗,因此也可以更好的利用服务器的流量。 因此也不建议公司在生产环境里使用飞书来作为图片的冷存储,还是老老实实走 S3 吧。 Q: 怎么连接飞书?有对应的文档吗? A:项目简介那里有个文档链接,里面就有的。 1 个帖子 - 1 位参与者 阅读完整话题