Переписать код с 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)
}
→ Ссылка