553 字
3 分钟
神必实践小工具

起因#

很想实践一下之前看到的一个逆天项目

wyf9
/
sleepy
Waiting for api.github.com...
00K
0K
0K
Waiting...

所以打算搓一个放博客上

原版是有一个页面的,我打算直接嵌入到博客里面,所以打算搞一个纯api版本的

实现#

后端代码#

感觉后端部分其实和计数模块挺像的

于是就从之前页面计数的api拿过来稍微改了一下

kodatemitsuru
/
sleepy_api
Waiting for api.github.com...
00K
0K
0K
Waiting...

前端代码#

然后就是前端,打算是塞在博客的侧边栏上面

所以用svelte搓了一个

<script lang="ts">
    import I18nKey from '@i18n/i18nKey'
    import { i18n } from '@i18n/translation'
    import { onMount, onDestroy } from 'svelte'
  
    let statu = $state("-1")
    let prevstatu = $state("-1")
    let difftime = $state(new Date(0))
    let year = $state(0)
    let months = $state(0)
    let days = $state(0)
    let hours = $state(0)
    let minutes = $state(0)
    let seconds = $state(0)

    const refreshInterval = 1000
  
    async function updatePageViews() {
      if (import.meta.env.DEV) {
        statu = "0"
        console.log('DEV mode, status set to 0')
      } else {
        try {

          const response = await fetch(
          "https://api.kodatemitsuru.com/api/status",
            {
              method: 'GET',
              headers: {
                'Content-Type': 'application/json',
              },
            }
          )
  
          if (!response.ok) {
            statu = "0"
          } else {
            const { status, prevstatus, prevtime } = await response.json()
            statu = status
            if (status === "0") {
              prevstatu = prevstatus
              difftime = new Date(prevtime)
              year = difftime.getFullYear() - 1970
              months = difftime.getUTCMonth()
              days = difftime.getUTCDate() - 1
              hours = difftime.getUTCHours()
              minutes = difftime.getUTCMinutes()
              seconds = difftime.getUTCSeconds()
            }
          }
        } catch (error) {
          console.error('Error fetching status:', error)
            statu = "0"
        }
      }
    }
  
    onMount(() => {
        updatePageViews()
        const intervalId = setInterval(updatePageViews, refreshInterval)

        onDestroy(() => {
            clearInterval(intervalId)
        })
    })

</script>
{#if statu === "-1"}
  {i18n(I18nKey.status)}: {i18n(I18nKey.status1)}
{:else if statu === "0"}
  {i18n(I18nKey.status)}: {i18n(I18nKey.status0)} <br>
  {i18n(I18nKey.prevstatus)}: {prevstatu} <br>
  {i18n(I18nKey.difftime)}: 
  {#if year > 0}{year} {i18n(I18nKey.year)} {/if}
  {#if months > 0}{months} {i18n(I18nKey.month)} {/if}
  {#if days > 0}{days} {i18n(I18nKey.day)} {/if}
  {#if hours > 0}{hours} {i18n(I18nKey.hour)} {/if}
  {#if minutes > 0}{minutes} {i18n(I18nKey.minute)} {/if}
  {#if seconds > 0}{seconds} {i18n(I18nKey.second)} {/if}
{:else}
  {i18n(I18nKey.status)}: {statu}
{/if}

手机通信#

其实最重要的还是手机端,原本使用dumpsys是需要adb权限的,但是adb重启会掉,所以我从adb给了一个 android.permission.DUMP然后从termux就可以使用dumpsys的(部分)功能,貌似走adb shell "dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp'"是不行的,所以最后选择了dumpsys activity activities | grep topResumedActivity然后剪掉一些多余的内容来获取当前的应用包名

问题#

手上的小米14还不打算root,所以保活是个大问题 这个貌似没有特别好的方案,现在就是先拿一个CPU wakelock,然后device_config里面设一个device_config put activity_manager imperceptible_kill_exempt_packages com.termux虽然还是会杀就是

神必实践小工具
https://blog.kodatemitsuru.com/posts/2025/01/03/神必实践小工具/
作者
Kodate Mitsuru
发布于
2025/01/03
许可协议
CC BY-NC-SA 4.0