使用curl批处理GCM令牌

时间:2017-10-25 13:28:59

标签: bash shell curl

我有一个带有一堆android令牌的.csv文件。对于所有这些令牌,我想检查它们是否仍然有效。最后,我想要一个带有额外列的.csv文件,该列称为“有效”,可以是0或1.(如果不是,则为0,如果不是,则为1)。

我想通过以下命令检查每个令牌:

curl --header "Authorization: key=[my API key]" --header Content-Type:"application/json" https://android.googleapis.com/gcm/send -d "{\"registration_ids\":[\"[my token]\"]}"

如果回复是

{  
   "multicast_id":[  
      id
   ],
   "success":0,
   "failure":1,
   "canonical_ids":0,
   "results":[  
      {  
         "error":"InvalidRegistration"
      }
   ]
}

令牌无效,我希望将“有效”列设置为0。

如何设置一个脚本,分别自动检查.csv中的每个标记,并使用正确的值更新“有效”列?

2 个答案:

答案 0 :(得分:2)

假设您可以使用GNU $2(即simplify CSV parsing),并且您的令牌存储在第二列中(注意awk tokens.csv 1 {}}行#!/bin/bash is_token_invalid() { args=( -s -H 'Authorization: key=[my API key]' -H 'Content-Type: application/json' -d '{"registration_ids": ["'"$1"'"]}' 'https://android.googleapis.com/gcm/send' ) curl "${args[@]}" | grep -q InvalidRegistration } awk -v FPAT='[^,]*|"[^"]+"' '{print $2}' tokens.csv | while read token; do is_token_invalid "$token" && echo 1 || echo 0 done | paste -d, tokens.csv -

/etc/hosts

答案 1 :(得分:1)

如果不了解CSV文件的格式,很难提供解决方案。使用带有4列的模拟CSV文件,你可以做一些非常粗暴的事情:

$ cat test.csv
blah,blah,token1,blah
blah,blah,token2,blah
blah,blah,token3,blah
$ ./test.sh < test.csv
blah,blah,token1,blah,1
blah,blah,token2,blah,1
blah,blah,token3,blah,1

代码:

#!/usr/bin/env bash

set -euo pipefail

invalid_response () {
  cat << 'EOF'
{
   "multicast_id":[
      id
   ],
   "success":0,
   "failure":1,
   "canonical_ids":0,
   "results":[
      {
         "error":"InvalidRegistration"
      }
   ]
}
EOF
}

is_invalid_token () {
  declare token="${1:-}"
  [[ "$(curl -sSL \
    --header "Authorization: key=[my API key]" \
    --header Content-Type:"application/json" \
    https://android.googleapis.com/gcm/send \
    -d "{\"registration_ids\":[\"$token\"]}")" == "$(invalid_response)" ]]
}

main () {
  declare token="" valid=""
  while IFS="," read -r col1 col2 token col4 valid ; do
    valid=1
    if is_invalid_token "$token" ; then
      valid=0
    fi
    printf "$col1,$col2,$token,$col4,$valid\n"
  done
}

main "$@"

这不是一个很好的解决方案,因为它完整地重构了每个CSV行,并且它将JSON响应与您的文字字符串示例进行比较。

最好准确地知道响应的哪个部分应该用来表示有效或无效,并使用像jq这样的工具来解析您要测试的特定数据的响应。