Переписать код с Python на Kotlin или Java
У меня есть код на Python, который выполняет поиск по картинке в Яндексе и возвращает ссылку на найденные результаты:
import json
import requests
filePath = "C:\\path\\whateverThisIs.png"
searchUrl = 'https://yandex.ru/images/search'
files = {'upfile': ('blob', open(filePath, 'rb'), 'image/jpeg')}
params = {'rpt': 'imageview', 'format': 'json', 'request': '{"blocks":[{"block":"b-page_type_search-by-image__link"}]}'}
response = requests.post(searchUrl, params=params, files=files)
query_string = json.loads(response.content)['blocks'][0]['params']['url']
img_search_url= searchUrl + '?' + query_string
print(img_search_url)
(взял его отсюда https://stackoverflow.com/questions/61978049/reverse-search-an-image-in-yandex-images-using-python). Мне надо переписать его на Kotlin (можно и на Java).
Основную часть кода я переписал:
fun main() {
val client = HttpClientBuilder.create().build()
val url = "https://yandex.ru/images/search"
val filePath = "C:\\Users\\Jetug\\Desktop\\original.jpg"
val post = HttpPost(url)
val entity = MultipartEntityBuilder.create()
entity.addPart("rpt", StringBody("imageview", ContentType.MULTIPART_FORM_DATA))
entity.addPart("format", StringBody("json", ContentType.MULTIPART_FORM_DATA))
entity.addPart("request", StringBody("{\"blocks\":[{\"block\":\"b-page_type_search-by-image__link\"}]}", ContentType.MULTIPART_FORM_DATA))
entity.addPart("upfile", FileBody(File(filePath)))
post.entity = entity.build()
val response = client.execute(post)
val rd = BufferedReader(InputStreamReader(response.entity.content))
var text: String? = ""
while (rd.readLine().also { text += it } != null) { }
println(text)
}
Однако мне не понятно как перенести код отвечающий за отправку картинки:
files = {'upfile': ('blob', open(filePath, 'rb'), 'image/jpeg')}
и получение ссылки:
query_string = json.loads(response.content)['blocks'][0]['params']['url']
При запуске моего кода в ответ я получаю страницу с таким результатом:
Помогите пожалуйста.
Ответы (1 шт):
Автор решения: Jetug
→ Ссылка
Спустя долгое время я нашёл библиотеку khttp для kotlin которая повторяет функционал requests и написал этот код.
fun main() {
val searchUrl = "https://yandex.ru/images/search"
val filePath = "C:\\Users\\Professional\\Desktop\\2018-11-09_23-44-58.png"
val file = File(filePath)
val fileLike = FileLike("upfile", file.name, file.readBytes())
val values = mapOf(
"rpt" to "imageview",
"format" to "json",
"request" to "{\"blocks\":[{\"block\":\"b-page_type_search-by-image__link\"}]}",
)
val result = khttp.post(
url = searchUrl,
params = values,
files = listOf(fileLike)
)
val obj : JSONObject = result.jsonObject
val url = (((obj["blocks"] as JSONArray)[0] as JSONObject)["params"] as JSONObject)["url"]
val resultUrl = searchUrl + "?" + url
println(resultUrl)
}