Получите ссылку на вопрос и ответ на уровне пользователя с помощью Stack Exchange API

Основываясь на моем предыдущем вопросе, я могу получить список всех непринятых ответов в диапазоне дат на уровне пользователя, используя Stack Exchange API со следующей командой curl:

curl "https://api.stackexchange.com/2.2/users/10348758/answers?page=1&pagesize=100&fromdate=1588291200&todate=1592179200&order=desc&sort=activity&site=stackoverflow&access_token=my-access-token&key=my-key" | gunzip | jq '.items[] | select(.is_accepted == false)'

Ответ JSON для приведенной выше команды выглядит примерно так:

 {
  "owner": {
    "reputation": 1595,
    "user_id": 10348758,
    "user_type": "registered",
    "profile_image": "https://www.gravatar.com/avatar/01ccf806a00d7deb1bf15323bc3edbe8?s=128&d=identicon&r=PG&f=1",
    "display_name": "Bhavya",
    "link": "https://stackoverflow.com/users/10348758/bhavya"
  },
  "is_accepted": false,
  "score": 0,
  "last_activity_date": 1592102481,
  "creation_date": 1592102481,
  "answer_id": 62367766,
  "question_id": 62367395,
  "content_license": "CC BY-SA 4.0"
}

В приведенном выше ответе я получаю answer_id и question_id, ссылки на эти ответы и вопросы не включены в ответ.

Включив &filter=withbody в команду curl, я могу получить тело ответа. Модифицированная команда curl:

curl "https://api.stackexchange.com/2.2/users/10348758/answers?page=1&pagesize=100&fromdate=1588291200&todate=1592179200&order=desc&sort=activity&site=stackoverflow&filter=withbody&access_token=my-access-token&key=my-key" | gunzip | jq '.items[] | select(.is_accepted == false)'

Можно ли как-то получить ссылки на ответ и вопрос, включенные в ответ? Я ссылался на эти пользовательские фильтры в документации, но не могу понять, как их применять.

Кто-нибудь может мне с этим помочь?


person ESCoder    schedule 27.06.2020    source источник


Ответы (1)


Как насчет этого ответа?

Ваша текущая ситуация выглядит следующим образом.

  1. Полученные значения из вашего URL включают в себя как answer_id, так и question_id. В этом случае URL-адреса для ответа и вопроса могут быть созданы как https://stackoverflow.com/a/{answer_id} и https://stackoverflow.com/q/{question_id} соответственно. Я упоминал в здесь.
  2. В вашей команде curl jq используется как jq '.items[] | select(.is_accepted == false)'.

Из приведенной выше ситуации в этом ответе я хотел бы предложить добавить URL-адреса ответа и вопроса к извлеченным значениям, добавив параметр в jq.

Модифицированная команда jq:

В этом случае измененная команда jq выглядит следующим образом.

jq '[.items[] | select(.is_accepted == false) |= . + {"answerUrl": ("https://stackoverflow.com/a/" + (.answer_id|tostring)), "questionUrl": ("https://stackoverflow.com/q/" + (.question_id|tostring))}]'

Измененная команда curl:

Когда ваша команда curl изменена, она становится следующей.

curl "https://api.stackexchange.com/2.2/users/10348758/answers?page=1&pagesize=100&fromdate=1588291200&todate=1592179200&order=desc&sort=activity&site=stackoverflow&filter=withbody&access_token=my-access-token&key=my-key" | gunzip | jq '[.items[] | select(.is_accepted == false) |= . + {"answerUrl": ("https://stackoverflow.com/a/" + (.answer_id|tostring)), "questionUrl": ("https://stackoverflow.com/q/" + (.question_id|tostring))}]'

Результат:

Когда запускается вышеописанная модифицированная команда curl, извлекается следующий результат. Вы можете увидеть значения answerUrl и questionUrl в результате.

[
  {
    "owner": {###},
    "is_accepted": false,
    "score": ###,
    "last_activity_date": ###,
    "creation_date": ###,
    "answer_id": ###,
    "question_id": ###,
    "content_license": "###",
    "answerUrl": "https://stackoverflow.com/a/###",  <--- Added
    "questionUrl": "https://stackoverflow.com/q/###"  <--- Added
  },
  ,
  ,
  ,
]

Использованная литература:

Добавлен:

Если вы хотите включить заголовок в извлеченные значения, используйте настраиваемый фильтр следующим образом.

Модифицированная команда jq:

curl "https://api.stackexchange.com/2.2/users/10348758/answers?page=1&pagesize=100&fromdate=1588291200&todate=1592179200&order=desc&sort=activity&site=stackoverflow&access_token=my-access-token&key=my-key&filter=%21T%2AhPUiv_%28m%28rgrhfg_" | gunzip | jq '[.items[] | select(.is_accepted == false)]'
  • В этом случае фильтр filter=%21T%2AhPUiv_%28m%28rgrhfg_ добавляется в качестве параметра запроса. Тем самым добавляется заголовок. В этот настраиваемый фильтр включены title,link,.share_link. При этом ссылки на заголовок, ответ и вопрос включаются в возвращаемые значения. Так что команда jq может быть проще.

Ссылка:

person Tanaike    schedule 27.06.2020
comment
Спасибо за ваш ответ! Это сработало как шарм :), но здесь можно получить заголовок вопроса, также включенный в ссылку на вопрос. Например: для этого вопроса https://stackoverflow.com/questions/62606821/get-the-link-of-question-and-answer-at-user-level-using-stack-exchange-api/62607859#62607859 заголовок вопроса включен в URL-адрес - person ESCoder; 27.06.2020
comment
@Bhavya Спасибо за ответ. Я не мог заметить, что вы хотели получить титул. Это связано с моим плохим знанием английского языка. Я глубоко извиняюсь за это. Для получения заголовка я добавил в свой ответ еще одну модифицированную команду curl. Не могли бы вы подтвердить это? - person Tanaike; 27.06.2020
comment
Спасибо за ответ. При запуске модифицированной выше команды curl я получаю эту ошибку jq: error (at <stdin>:0): Cannot iterate over null (null) - person ESCoder; 27.06.2020
comment
@Bhavya Спасибо за ответ. Используя настраиваемый фильтр, он включает заголовок, ссылки на ответы и вопросы. Для этого я обновил свой ответ. Не могли бы вы подтвердить это? - person Tanaike; 27.06.2020
comment
@Bhavya В вашем образце завитка я забыл, что filter=withbody был включен. При этом возникает такая ошибка. Поэтому я удалил его. Не могли бы вы подтвердить это? - person Tanaike; 27.06.2020
comment
Модифицированные команды curl работают отлично :) Большое спасибо :) - person ESCoder; 27.06.2020