{"id":19725434,"url":"https://github.com/easychen/timetodo-server","last_synced_at":"2025-04-29T23:30:47.296Z","repository":{"id":145559475,"uuid":"160751109","full_name":"easychen/timetodo-server","owner":"easychen","description":"remote server for timetodo","archived":false,"fork":false,"pushed_at":"2019-02-21T07:44:21.000Z","size":106535,"stargazers_count":107,"open_issues_count":1,"forks_count":8,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-04-05T20:11:18.218Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/easychen.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-12-07T00:51:55.000Z","updated_at":"2025-03-31T13:23:32.000Z","dependencies_parsed_at":null,"dependency_job_id":"8304b42d-78c4-41eb-a23d-764a76555a7a","html_url":"https://github.com/easychen/timetodo-server","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/easychen%2Ftimetodo-server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/easychen%2Ftimetodo-server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/easychen%2Ftimetodo-server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/easychen%2Ftimetodo-server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/easychen","download_url":"https://codeload.github.com/easychen/timetodo-server/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251599736,"owners_count":21615574,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-11T23:29:50.578Z","updated_at":"2025-04-29T23:30:47.281Z","avatar_url":"https://github.com/easychen.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# TimeTodo \n\n![](./image/timetodo.001.jpeg)\n\nTimeTodo 是一个浮层式的半透明 Todo 应用。除此之外，点击每个 Todo 项后的箭头，可以开始计时。\n\n![](./image/timetodo.002.jpeg)\n\n从 1.0 版本开始 TimeTodo 开始允许用户在添加 Todo 的输入框输入以冒号开头的命令，并以此触发 Web hook 想特定的 URL post Todo数据，并根据其返回值，执行 JS 命令或者 Electron 的命令。此功能极大的提升了 TimeTodo 的可定制性。使其可以用来：\n\n- 读取其他网站的数据并添加为 TODO\n- 生成随机密码并复制到剪贴板\n- 通过命令设置面板背景和浮动\n- 快捷查找PHP 函数\n- 以及其他 JS 命令和 Electron 命令可以完成的任务。\n\n## 安装使用\n\n[视频说明](https://www.bilibili.com/video/av37635866/)\n\n以下为 Mac 版说明\n\n⚠️ 1.0使用的存储和之前不同，请预先备份Todo内容。\n\n\n### 客户端安装\n\n1. 从[官网](http://timetodo.ftqq.com/)下载 Zip 包解压\n2. 将 TimeTodo.***.zip 的包解压，将其中的 TimeTodo.app 复制或者移动到 Application 目录\n3. 从 Application 或者启动面板中点击 TimeTodo 图标启动应用\n\n这时候可以正常使用 Todo 的待办事项、计时等相关功能。\n\n高级功能如下：\n\n1. 将电脑上的图片拖拽到Todo添加输入框（ 显示 `add new to-do or command` 处 ），可以为 TimeTodo 设置背景\n2. 在Todo添加输入框输入 `:clean` 并回车可以将背景清空\n3. 在Todo添加输入框输入 `:close` 并回车可以退出应用\n\n### Web hook 相关功能\n\n### WebHook 测试\n\n⚠️ webhook 会向 hook 地址发送 Todo 数据和剪贴板数据，并执行返回的脚本，所以请务必自行架设。以下地址只供测试，测试完成后请及时更换。\n\n1. 在Todo添加输入框输入 `:webhook=https://timetodo.applinzi.com/` 并回车，可以设置 web hook\n2. 输入 `:who` 可以测试是否 work 。提示 It's me 为可以正常工作\n3. 输入 `:find sort` 会打开php手册 sort 函数页面\n\n这个时候 TimeTodo 设置的官方提供的 web hook 服务端，只是用于演示，你需要来部署一个自己的服务端。\n\n⚠️ 以下功能需要有 Web 服务器以及 PHP（或者其他语言的） 开发经验。\n\n\n### 服务端部署\n\n\n1. 修改 index.php 将其中 `$APIKEY = null; ` 修改为 `$APIKEY = \"yourkey\"; ` 以提升安全性\n2. 将 `index.php` 和 `_lp.php` 上传到可以访问的 Web 服务器，我们假设其公网可访问链接为 `http://somesite.com/`\n3. 在Todo添加输入框输入 `:webhook=https://somesite.com/?key=yourkey` 并回车以设置 web hook\n4. 再次输入 `:who` 可以测试是否 work 。提示 It's me 为可以正常工作\n\n#### 修改和添加命令\n\nTimeTodo 客户端在用户输入的 Todo 内容以冒号开头时，会查找本地内置的命令，当命令不存在时，会检查是否设置过 web hook。\n如果发现存在 web hook，则会向该 URL POST 两个变量 ， cmd 为用户输入的命令、todos 为 TimeTodo 客户端 Todo 列表的 Json 数组。\n\n同时，TimeTodo 客户端会检查该 URL 的返回值。其格式为\n\n```json\n{\n    code:\"0\",\n    js:\"\",\n    cmd:\"\"\n}\n```\n其中 code 为 0 表示正常；js 为希望 TimeTodo 客户端执行的 JS 命令、cmd 为希望 TimeTodo 客户端执行的 Electron 命令。\n\n在此基础上，我们可以根据场景进行编程。以下为示范代码：\n\n```php\n\n$ret = [];\n$ret['code'] = 0;\n$ret['js'] = ''; // 页面 js\n$ret['cmd'] = ''; // eletron 命令\n\n$cmd = t(v('cmd')); // TimeTodo 上的命令，包含冒号\n\n// 根据命令来修改返回值相关数据\nswitch( $cmd )\n{\n    // 直接返回JS命令\n    case ':who':\n        $ret['js'] = \"alert('It\\' me 🤠 ')\";\n        break;\n\n    // 分析 TODO （会 POST 到 $_REQUEST['todos'] 里边 ）\n    // 并返回数据\n    case ':howmany':\n        $todos = json_decode( v('todos') , true );\n        $ret['js'] = \"alert('你总共有\" . count( $todos ) . \"个TODO')\"; \n        break; \n    \n    // 对 TODO 数据进行操作\n    // 数据对象为 this.props.store\n    // 方法包括：\n    // 添加 todo_add( text )\n    // 完成 todo_check( id ) // id 可以分析 $_POST['todos'] 取到\n    // 未完成 todo_uncheck( id ) \n    // 开始计时 todo_play( id ) \n    // 清除已经完成的TODO todo_clean()\n    case ':add':\n        $ret['js'] = \"this.props.store.todo_add('remote one')\"; \n        break;\n\n    // JS 直接操作剪贴板\n    case ':rand':\n        $ret['js'] = 'window.require(\"electron\").clipboard.writeText(\"'.uniqid().'\");alert(\"随机密码已复制到剪贴板\")';  \n        break; \n    \n    // 设置面板背景    \n    case ':bg':\n        $ret['js'] = 'document.querySelector(\"html\").style.backgroundImage = \"url(\\'https://ws1.sinaimg.cn/large/40dfde6fly1fxy3his1hsj20jq0rsk0q.jpg\\')\";';  \n        break;\n    \n    // 提示音\n    case ':beep':\n        $ret['js'] = 'window.require(\"electron\").shell.beep()'; \n        break;\n\n    // 取消顶层浮动\n    case ':nofloat':\n        $ret['cmd'] = 'win.setAlwaysOnTop(false, \"normal\", 0);'; \n        break; \n    \n    // 开启顶层浮动\n    case ':float':\n        $ret['cmd'] = 'win.setAlwaysOnTop(true, \"floating\", 1);'; \n        break;     \n    \n    // 运行 electron 命令，支持所有的命令\n    case ':quit':\n        $ret['cmd'] = \"app.quit()\"; \n        break; \n    \n    default:\n        // 正则演示 find sort 搜索 PHP 手册\n        if( preg_match(\"/:find\\s(.+?)$/i\" , $cmd , $out ) )\n        {\n            $ret['js'] = 'window.require(\"electron\").shell.openExternal(\"http://www.php.net/manual-lookup.php?pattern=' . $out[1] . '\");';\n        }\n        else\n        {\n            $ret['js'] = 'alert(\"输入的命令是' . $cmd . '\")';\n        }\n        \n\n}\n\n// $ret['cmd'] = 'app.quit()';\n\nreturn send_result( $ret );\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feasychen%2Ftimetodo-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feasychen%2Ftimetodo-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feasychen%2Ftimetodo-server/lists"}