Skip to content

Copyseeker

Classes

Copyseeker

Bases: BaseSearchEngine[CopyseekerResponse]

API client for the Copyseeker image search engine.

Used for performing reverse image searches using Copyseeker service.

Attributes:

Name Type Description
base_url str

The base URL for Copyseeker searches.

Source code in PicImageSearch/engines/copyseeker.py
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
class Copyseeker(BaseSearchEngine[CopyseekerResponse]):
    """API client for the Copyseeker image search engine.

    Used for performing reverse image searches using Copyseeker service.

    Attributes:
        base_url (str): The base URL for Copyseeker searches.
    """

    def __init__(self, base_url: str = "https://copyseeker.net", **request_kwargs: Any):
        """Initializes a Copyseeker API client.

        Args:
            base_url (str): The base URL for Copyseeker searches.
            **request_kwargs (Any): Additional arguments for network requests.
        """
        super().__init__(base_url, **request_kwargs)

    async def _get_discovery_id(
        self, url: Optional[str] = None, file: Union[str, bytes, Path, None] = None
    ) -> Optional[str]:
        """Retrieves a discovery ID from Copyseeker for image search.

        This method handles two search scenarios:
            1. Search by image URL
            2. Search by uploading a local image file

        Args:
            url (Optional[str]): URL of the image to search.
            file (Union[str, bytes, Path, None]): Local image file, can be a path string, bytes data, or Path object.

        Returns:
            Optional[str]: The discovery ID if successful, None otherwise.

        Note:
            - The discovery ID is required for retrieving search results.
        """

        resp = None
        discovery_id = None

        if url:
            data = {"discoveryType": "ReverseImageSearch", "imageUrl": url}
            headers = {
                "next-action": "408936c3bdf458fbec6cf3c1253f56aefbcb4cf509",
                "content-type": "text/plain;charset=UTF-8",
            }

            resp = await self._make_request(
                method="post",
                headers=headers,
                data=json_dumps([data]),
            )
        elif file:
            files = {
                "1_file": (os.path.basename(file), read_file(file), "image/jpeg"),
                "1_discoveryType": (None, "ReverseImageSearch"),
                "0": (None, '["$K1"]'),
            }
            headers = {
                "next-action": "40dc303bfd320afd703a1a0a159464be4d64117f96",
                "content-type": "multipart/form-data; boundary=-",
            }

            resp = await self._make_request(
                method="post",
                headers=headers,
                files=files,
            )

        if resp:
            for line in resp.text.splitlines():
                line = line.strip()
                if line.startswith("1:{"):
                    discovery_id = json_loads(line[2:]).get("discoveryId")
                    break

        return discovery_id

    async def search(
        self,
        url: Optional[str] = None,
        file: Union[str, bytes, Path, None] = None,
        **kwargs: Any,
    ) -> CopyseekerResponse:
        """Performs a reverse image search on Copyseeker.

        This method supports two ways of searching:
            1. Search by image URL
            2. Search by uploading a local image file

        The search process involves two steps:
            1. Obtaining a discovery ID
            2. Retrieving search results using the discovery ID

        Args:
            url (Optional[str]): URL of the image to search.
            file (Union[str, bytes, Path, None]): Local image file, can be a path string, bytes data, or Path object.
            **kwargs (Any): Additional arguments passed to the parent class.

        Returns:
            CopyseekerResponse: An object containing search results and metadata.
                Returns an empty response if discovery ID cannot be obtained.

        Raises:
            ValueError: If neither `url` nor `file` is provided.

        Note:
            - Only one of `url` or `file` should be provided.
            - The search process involves multiple HTTP requests to Copyseeker's API.
        """
        self._validate_args(url, file)

        discovery_id = await self._get_discovery_id(url, file)
        if discovery_id is None:
            return CopyseekerResponse({}, "")

        data = [{"discoveryId": discovery_id, "hasBlocker": "False"}]
        headers = {
            "next-action": "4084b9ef4e0e6922ef12b23a4b8517be790fa67b88",
            "content-type": "text/plain;charset=UTF-8",
        }

        resp = await self._make_request(
            method="post", endpoint="discovery", data=json_dumps(data), headers=headers
        )

        resp_json = {}

        for line in resp.text.splitlines():
            line = line.strip()
            if line.startswith("1:{"):
                resp_json = json_loads(line[2:])
                break

        return CopyseekerResponse(resp_json, resp.url)

Functions

__init__(base_url='https://copyseeker.net', **request_kwargs)

Initializes a Copyseeker API client.

Parameters:

Name Type Description Default
base_url str

The base URL for Copyseeker searches.

'https://copyseeker.net'
**request_kwargs Any

Additional arguments for network requests.

{}
Source code in PicImageSearch/engines/copyseeker.py
21
22
23
24
25
26
27
28
def __init__(self, base_url: str = "https://copyseeker.net", **request_kwargs: Any):
    """Initializes a Copyseeker API client.

    Args:
        base_url (str): The base URL for Copyseeker searches.
        **request_kwargs (Any): Additional arguments for network requests.
    """
    super().__init__(base_url, **request_kwargs)
search(url=None, file=None, **kwargs) async

Performs a reverse image search on Copyseeker.

This method supports two ways of searching
  1. Search by image URL
  2. Search by uploading a local image file
The search process involves two steps
  1. Obtaining a discovery ID
  2. Retrieving search results using the discovery ID

Parameters:

Name Type Description Default
url Optional[str]

URL of the image to search.

None
file Union[str, bytes, Path, None]

Local image file, can be a path string, bytes data, or Path object.

None
**kwargs Any

Additional arguments passed to the parent class.

{}

Returns:

Name Type Description
CopyseekerResponse CopyseekerResponse

An object containing search results and metadata. Returns an empty response if discovery ID cannot be obtained.

Raises:

Type Description
ValueError

If neither url nor file is provided.

Note
  • Only one of url or file should be provided.
  • The search process involves multiple HTTP requests to Copyseeker's API.
Source code in PicImageSearch/engines/copyseeker.py
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
async def search(
    self,
    url: Optional[str] = None,
    file: Union[str, bytes, Path, None] = None,
    **kwargs: Any,
) -> CopyseekerResponse:
    """Performs a reverse image search on Copyseeker.

    This method supports two ways of searching:
        1. Search by image URL
        2. Search by uploading a local image file

    The search process involves two steps:
        1. Obtaining a discovery ID
        2. Retrieving search results using the discovery ID

    Args:
        url (Optional[str]): URL of the image to search.
        file (Union[str, bytes, Path, None]): Local image file, can be a path string, bytes data, or Path object.
        **kwargs (Any): Additional arguments passed to the parent class.

    Returns:
        CopyseekerResponse: An object containing search results and metadata.
            Returns an empty response if discovery ID cannot be obtained.

    Raises:
        ValueError: If neither `url` nor `file` is provided.

    Note:
        - Only one of `url` or `file` should be provided.
        - The search process involves multiple HTTP requests to Copyseeker's API.
    """
    self._validate_args(url, file)

    discovery_id = await self._get_discovery_id(url, file)
    if discovery_id is None:
        return CopyseekerResponse({}, "")

    data = [{"discoveryId": discovery_id, "hasBlocker": "False"}]
    headers = {
        "next-action": "4084b9ef4e0e6922ef12b23a4b8517be790fa67b88",
        "content-type": "text/plain;charset=UTF-8",
    }

    resp = await self._make_request(
        method="post", endpoint="discovery", data=json_dumps(data), headers=headers
    )

    resp_json = {}

    for line in resp.text.splitlines():
        line = line.strip()
        if line.startswith("1:{"):
            resp_json = json_loads(line[2:])
            break

    return CopyseekerResponse(resp_json, resp.url)

Functions