GetForegroundWindow и GetFocus — выдают разные дескрипторы
Подскажите пожалуйста, где я ошибаюсь: GetForegroundWindow — возвращает дескриптор того окна, который находится на переднем плане и имеет фокус клавиатуры, и если на переднем плане находится окно не имеющее фокуса клавиатуры, то функция вернет дескриптор окна, которое имеет фокус клавиатуры. GetFfocus — возвращает дескриптор того окна, на котором в данный момент фокус клавиатуры. Я запускаю код с этими двумя функциями ставлю задержку 10 секунд — открываю обычный текстовый файл и смотрю какие дескрипторы выдадут эти функции. И они выдают разные дескрипторы:
Sleep(10000); HWND my_HWND_ = GetForegroundWindow(); std::cout
Я ожидал увидеть одинаковые дескрипторы, но они разные. Вот и думаю где я ошибаюсь ?
Отслеживать
задан 30 мар 2021 в 9:02
1,045 7 7 серебряных знаков 17 17 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
GetForegroundWindow возвращает дескриптор окна верхнего уровня (т.е. не дочернего), которое сейчас находится на переднем плане. GetFocus возвращает дескриптор окна (в т.ч. дочернего), использующего очередь сообщений текущего потока и владеющего фокусом клавиатуры.
Отслеживать
ответ дан 30 мар 2021 в 9:37
user7860670 user7860670
29.9k 3 3 золотых знака 17 17 серебряных знаков 36 36 бронзовых знаков
user7860670, но в моем случае разве это не одно и тоже окно блокнота ?
30 мар 2021 в 9:40
@Optimus1 Нет, у блокнота несколько дочерних окон, в т.ч. вся область с текстом.
30 мар 2021 в 9:58
- c++
- c
- winapi
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.4.30.8420
Мы используем файлы cookie для персонализации и повышения качества контента и услуг, показа актуальной рекламы и обеспечения общей безопасности. Вы в любой момент можете проверить свои настройки использования файлов cookie. Подробнее об использовании файлов cookie и доступных вам инструментах управления см. в Политике в отношении файлов cookie.
Принимать все Управление настройками данных
Браузер не поддерживается
Вы используете браузер, который Facebook не поддерживает. Чтобы все работало, мы перенаправили вас в упрощенную версию.
Руководство к дескрипторам
В этой статье я расскажу о том, что такое дескрипторы, о протоколе дескрипторов, покажу как вызываются дескрипторы. Опишу создание собственных и исследую несколько встроенных дескрипторов, включая функции, свойства, статические методы и методы класса. С помощью простого приложения покажу, как работает каждый из них, приведу эквиваленты внутренней реализации работы дескрипторов кодом на чистом питоне.
Изучение того, как работают дескрипторы, откроет доступ к большему числу рабочих инструментов, поможет лучше понять как работает питон, и ощутить элегантность его дизайна.
Введение и определения
Если говорить в общем, то дескриптор — это атрибут объекта со связанным поведением (англ. binding behavior), т.е. такой, чьё поведение при доступе переопределяется методами протокола дескриптора. Эти методы: __get__ , __set__ и __delete__ . Если хотя бы один из этих методов определён для объекта, то он становится дескриптором.
Стандартное поведение при доступе к атрибутам — это получение, установка и удаление атрибута из словаря объекта. Например, a.x имеет такую цепочку поиска атрибута: a.__dict__['x'] , затем в type(a).__dict__['x'] , и далее по базовым классам type(a) не включая метаклассы. Если же искомое значение — это объект, в котором есть хотя бы один из методов, определяющих дескриптор, то питон может изменить стандартную цепочку поиска и вызвать один из методов дескриптора. Как и когда это произойдёт зависит от того, какие методы дескриптора определены для объекта. Дескрипторы вызываются только для объектов или классов нового стиля (класс является таким, если наследует от object или type ).
Дескрипторы — это мощный протокол с широкой областью применения. Они являются тем механизмом, который стоит за свойствами, методами, статическими методами, методами класса и вызовом super() . Внутри самого питона с их помощью реализуются классы нового стиля, которые были представлены в версии 2.2. Дескрипторы упрощают понимание нижележащего кода на C, а также представляют гибкий набор новых инструментов для любых программ на питоне.
Протокол дескрипторов
descr.__get__(self, obj, type=None) --> значение descr.__set__(self, obj, value) --> None descr.__delete__(self, obj) --> None
Собственно это всё. Определите любой из этих методов и объект будет считаться дескриптором, и сможет переопределять стандартное поведение, если его будут искать как атрибут.
Если объект определяет сразу и __get__ , и __set__ , то он считается дескриптором данных (англ. data descriptor). Дескрипторы, которые определили только __get__ называются дескрипторами не данных (англ. non-data descriptors). Их называются так, потому что они используют для методов, но другие способы их применения также возможны.
Дескрипторы данных и не данных отличаются в том, как будет изменено поведение поиска, если в словаре объекта уже есть запись с таким же именем как у дескриптора. Если попадается дескриптор данных, то он вызывается раньше, чем запись из словаря объекта. Если в такой же ситуации окажется дескриптор не данных, то запись из словаря объекта имеет преимущество перед этим дескриптором.
Чтобы создать дескриптор данных только для чтения, определите и __get__ , и __set__ , и сделайте так, чтобы __set__ выбрасывал исключение AttributeError . Определения метода __set__ и выбрасывания исключения достаточно, чтобы этот дескриптор считался дескриптором данных.
Вызов дескрипторов
Дескриптор можно вызвать напрямую через его метод. Например, d.__get__(obj) .
Однако, наиболее частый вариант вызова дескриптора — это автоматический вызов во время доступа к атрибуту. Например, obj.d ищет d в словаре obj . Если d определяет метод __get__ , то будет вызван d.__get__(obj) . Вызов будет сделан согласно правилам, описанным ниже.
Детали вызова различаются от того, чем является obj — объектом или классом. В любом случае, дескрипторы работают только для объектов и классов нового стиля. Класс является классом нового стиля, если он является потомком object .
Для объектов алгоритм реализуется с помощью object.__getattribute__ , который преобразует запись b.x в type(b).__dict__['x'].__get__(b, type(b)) . Реализация работает через цепочку предшественников, в которой дескрипторы данных имеют приоритет перед переменными объекта, переменные объекта имеют приоритет перед дескрипторами не данных, и самый низкий приоритет у метода __getattr__ , если он определён. Полную реализацию на языке C можно найти в PyObject_GenericGetAttr() в файле Objects/object.c .
Для классов алгоритм реализуется с помощью type.__getattribute__ , который преобразует запись B.x в B.__dict__['x'].__get__(None, B) . На чистом питоне это выглядит так:
def __getattribute__(self, key): "Эмуляция type_getattro() в Objects/typeobject.c" v = object.__getattribute__(self, key) if hasattr(v, '__get__'): return v.__get__(None, self) return v
- дескрипторы вызываются с помощью метода __getattribute__
- переопределение __getattribute__ прекратит автоматический вызов дескрипторов
- __getattribute__ доступен только внутри классов и объектов нового стиля
- object.__getattribute__ и type.__getattribute__ делают разные вызовы к __get__
- дескрипторы данных всегда имеют преимущество перед переменными объекта
- дескрипторы не данных могут потерять преимущество из-за переменных объекта
Примечание: в питоне 2.2, super(B, obj).m() вызывал __get__ только если m был дескриптором данных. В питоне 2.3, дескрипторы не данных тоже вызываются, за исключением тех случаев, когда используются классы старого стиля. Детали реализации можно найти в super_getattro() в файле Objects/typeobject.c , а эквивалент на чистом питоне можно найти в пособии от Guido.
Детали выше описывают, что алгоритм вызова дескрипторов реализуется с помощью метода __getattribute__() для object , type и super . Классы наследуют этот алгоритм, когда они наследуют от object или если у них есть метакласс, реализующий подобную функциональность. Таким образом, классы могут отключить вызов дескрипторов, если переопределят __getattribute__() .
Пример дескриптора
Следующий код создаёт класс, чьи объекты являются дескрипторам данных и всё, что они делают — это печатают сообщение на каждый вызов get или set . Переопределение __getattribute__ — это альтернативный подход, с помощью которого мы могли бы сделать это для каждого атрибута. Но если мы хотим наблюдать только за отдельными атрибутами, то это проще сделать с помощью дескриптора.
class RevealAccess(object): """Дескриптор данных, который устанавливает и возвращает значения, и печатает сообщение о том, что к атрибуту был доступ. """ def __init__(self, initval=None, name='var'): self.val = initval self.name = name def __get__(self, obj, objtype): print 'Получаю', self.name return self.val def __set__(self, obj, val): print 'Обновляю' , self.name self.val = val >>> class MyClass(object): x = RevealAccess(10, 'var "x"') y = 5 >>> m = MyClass() >>> m.x Получаю var "x" 10 >>> m.x = 20 Обновляю var "x" >>> m.x Получаю var "x" 20 >>> m.y 5
Этот простой протокол предоставляет просто увлекательные возможности. Некоторые из них настолько часто используются, что были объединены в отдельные функции. Свойства, связанные и несвязанные методы, статические методы и методы класса — все они основаны на этом протоколе.
Свойства
Вызова property() достаточно, чтобы создать дескриптор данных, который вызывает нужные функции во время доступа к атрибуту. Вот его сигнатура:
property(fget=None, fset=None, fdel=None, doc=None) --> атрибут, реализующий свойства
В документации показано типичное использование property() для создания управляемого атрибута x :
class C(object): def getx(self): return self.__x def setx(self, value): self.__x = value def delx(self): del self.__x x = property(getx, setx, delx, "Я свойство 'x'.")
Вот эквивалент property на чистом питоне, чтобы было понятно как реализовано property() с помощью протокола дескрипторов:
class Property(object): "Эмуляция PyProperty_Type() в Objects/descrobject.c" def __init__(self, fget=None, fset=None, fdel=None, doc=None): self.fget = fget self.fset = fset self.fdel = fdel self.__doc__ = doc def __get__(self, obj, objtype=None): if obj is None: return self if self.fget is None: raise AttributeError, "нечитаемый атрибут" return self.fget(obj) def __set__(self, obj, value): if self.fset is None: raise AttributeError, "не могу установить атрибут" self.fset(obj, value) def __delete__(self, obj): if self.fdel is None: raise AttributeError, "не могу удалить атрибут" self.fdel(obj)
Встроенная реализация property() может помочь, когда существовал интерфейс доступа к атрибуту и произошли какие-то изменения, в результате которых понадобилось вмешательство метода.
Например, класс электронной таблицы может давать доступ к значению ячейки через Cell('b10').value . В результате последующих изменений в программе, понадобилось сделать так, чтобы это значение пересчитывалось при каждом доступе к ячейке, однако программист не хочет менять клиентский код, который обращается к атрибуту напрямую. Эту проблему можно решить, если обернуть атрибут value с помощью дескриптора данных, который будет создан с помощью property() :
class Cell(object): . . . def getvalue(self, obj): "Пересчитываем ячейку прежде чем вернуть значение" self.recalc() return obj._value value = property(getvalue)
Функции и методы
В питоне все объектно-ориентированные возможности реализованы с помощью функционального подхода. Это сделано совсем незаметно с помощью дескрипторов не данных.
Словари классов хранят методы в виде функций. При определении класса, методы записываются с помощью def и lambda — стандартных инструментов для создания функций. Единственное отличие этих функций от обычных в том, что первый аргумент зарезервирован под экземпляр объекта. Этот аргумент обычно называется self , но может называться this или любым другим словом, которым можно называть переменные.
Для того, чтобы поддерживать вызов методов, функции включают в себя метод __get__ , который автоматически делает их дескрипторами не данных при поиске атрибутов. Функции возвращают связанные или не связанные методы, в зависимости от того, через что был вызван этот дескриптор.
class Function(object): . . . def __get__(self, obj, objtype=None): "Симуляция func_descr_get() в Objects/funcobject.c" return types.MethodType(self, obj, objtype)
С помощью интерпретатора мы можем увидеть как на самом деле работает дескриптор функции:
>>> class D(object): def f(self, x): return x >>> d = D() >>> D.__dict__['f'] # Внутренне хранится как функция >>> D.f # Доступ через класс возвращает несвязанный метод >>> d.f # Доступ через экземпляр объекта возвращает связанный метод >
Вывод интерпретатора подсказывает нам, что связанные и несвязанные методы — это два разных типа. Даже если они могли бы быть реализованы таким образом, на самом деле, реализация PyMethod_Type в файле Objects/classobject.c содержит единственный объект с двумя различными отображениями, которые зависят только от того, есть ли в поле im_self значение или там содержится NULL (C эквивалент значения None ).
Таким образом, эффект вызова метода зависит от поля im_self . Если оно установлено (т.е. метод связан), то оригинальная функция (хранится в поле im_func ) вызывается, как мы и ожидаем, с первым аргументом, установленным в значение экземпляра объекта. Если же она не связана, то все аргументы передаются без изменения оригинальной функции. Настоящая C реализация instancemethod_call() чуть более сложная, потому что включает в себя некоторые проверки типов и тому подобное.
Статические методы и методы класса
Дескрипторы не данных предоставляют простой механизм для различных вариантов привязки функций к методам.
Повторим ещё раз. Функции имеют метод __get__ , с помощью которых они становятся методами, во время поиска атрибутов и автоматического вызова дескрипторов. Дескрипторы не данных преобразуют вызов obj.f(*args) в вызов f(obj, *args) , а вызов klass.f(*args) становится f(*args) .
В этой таблице показано связывание и два наиболее популярных варианта:
Преобразование | Вызвана через объект | Вызвана через класс | |
---|---|---|---|
Дескриптор | функция | f(obj, *args) | f(*args) |
staticmethod | f(*args) | f(*args) | |
classmethod | f(type(obj), *args) | f(klass, *args) |
Статические методы возвращают функцию без изменений. Вызовы c.f или C.f эквиваленты вызовам object.__getattribute__(c, "f") или object.__getattribute__(C, "f") . Как результат, функция одинаково доступна как из объекта, так и из класса.
Хорошими кандидатами для статических методов являются методы, которым не нужна ссылка на переменную self .
Например, пакет для статистики может включать класс для экспериментальных данных. Класс предоставляет обычные методы для расчёта среднего, ожидания, медианы и другой статистики, которая зависит от данных. Однако, там могут быть и другие функции, которые концептуально связаны, но не зависят от данных. Например, erf(x) это простая функция для преобразования, которая нужна в статистике, но не зависит от конкретного набора данных в этом классе. Она может быть вызвана и из объекта, и из класса: s.erf(1.5) --> 0.9332 или Sample.erf(1.5) --> 0.9332 .
Так как staticmethod() возвращает функцию без изменений, то этот пример не удивляет:
>>> class E(object): def f(x): print x f = staticmethod(f) >>> print E.f(3) 3 >>> print E().f(3) 3
Если использовать протокол дескриптора не данных, то на чистом питоне staticmethod() выглядел бы так:
class StaticMethod(object): "Эмуляция PyStaticMethod_Type() в Objects/funcobject.c" def __init__(self, f): self.f = f def __get__(self, obj, objtype=None): return self.f
В отличие от статических методов, методы класса подставляют в начало вызова функции ссылку на класс. Формат вызова всегда один и тот же, и не зависит от того, вызываем мы метод через объект или через класс.
>>> class E(object): def f(klass, x): return klass.__name__, x f = classmethod(f) >>> print E.f(3) ('E', 3) >>> print E().f(3) ('E', 3)
Это поведение удобно, когда нашей функции всегда нужна ссылка на класс и ей не нужны данные. Один из способов использования classmethod() — это создание альтернативных конструкторов класса. В питоне 2.3, метод класса dict.fromkeys() создаёт новый словарь из списка ключей. Эквивалент на чистом питоне будет таким:
class Dict: . . . def fromkeys(klass, iterable, value=None): "Эмуляция dict_fromkeys() в Objects/dictobject.c" d = klass() for key in iterable: d[key] = value return d fromkeys = classmethod(fromkeys)
Теперь новый словарь уникальных ключей можно создать таким образом:
>>> Dict.fromkeys('abracadabra')
Если использовать протокол дескриптора не данных, то на чистом питоне classmethod() выглядел бы так:
class ClassMethod(object): "Эмуляция PyClassMethod_Type() в Objects/funcobject.c" def __init__(self, f): self.f = f def __get__(self, obj, klass=None): if klass is None: klass = type(obj) def newfunc(*args): return self.f(klass, *args) return newfunc
- python
- descriptor
- descriptor protocol
- питон
- дескриптор
- дескрипторы
- протокол дескрипторов
Дескриптор facebook где находится
Где лучше всего размещать ссылки в постах Facebook, чтобы улучшить взаимодействие с пользователями. Исследование
Без ссылок — нет конверсий, но именно они понижают охваты постов в Facebook. Как быть и какой формат поста выбрать, чтобы не упустить лиды?
SocialInsider попытался ответить на этот вопрос, проанализировав 51 054 216 сообщений в Facebook в партнёрстве с агентством цифрового маркетинга Lightspan Digital. И оказалось, что:
1. Добавление ссылки в пост Facebook понижает его охват вдвое. Это не удивительно с учётом того, что любая платформа хочет удержать пользователей как можно дольше, а внешние ссылки как раз этому не способствуют.
Тем не менее Facebook — отличная соцсеть, которая может помочь привлечь трафик на ваш сайт. Например, у видеоконтента средний рейтинг кликов 7,97%. Но когда вы определяете свои бизнес-цели, а также цели в соцсетях на год или квартал, нужно учитывать, что сообщения Facebook без ссылок получают в два раза больше вовлечённости, чем со ссылками.
2. При этом альбомы — самый вовлекающий вид публикаций в Facebook. Не важно — с ссылкой или без.
3. 99,76% брендов не размещают ссылку в первом комментарии к публикации в Facebook, хотя есть мнение, что эта тактика может обмануть социальные алгоритмы и повысить охваты и активность.
Одна из причин, по которой бренды неохотно размещают ссылки в первом комментарии к публикации в Facebook, может заключаться в том, что это выглядит непрофессионально: коммуникация кажется более эффективной, если вся информация находится в одном месте и красиво упакована.
Кроме того, при прокрутке вниз в мобильном формате комментарии не всегда отображаются сразу, поэтому существует большая вероятность, что ссылку попросту не заметят, что приведёт к потере потенциальной конверсии для бренда. Учитывая, что 98,5% пользователей Facebook изучают платформу с мобильных устройств, риск потерять клиентов и деньги слишком велик, чтобы оправдать эксперименты.
Что такое дескриптор социальных сетей?
Если вы не часто пользуетесь социальными сетями, некоторые из этих терминов могут вас запутать. Одним из них является «ручка социальных сетей».
В этой статье мы рассмотрим маркеры социальных сетей, объясним, что они из себя представляют, как их выбрать и как их используют веб-сайты.
Что такое дескриптор социальных сетей?
Дескриптор социальной сети не имеет ничего общего с пониманием чего-либо.
Скорее, дескриптор социальной сети — это публичное имя пользователя, которое представляет людей на сайтах социальных сетей . Публичное различие важно, поскольку имена пользователей существуют на других сайтах, где они не служат той же цели.
Например, когда вы входите на сайт своего банка, вы должны указать свое имя пользователя и пароль для входа в систему. Но это имя пользователя не является ручкой, поскольку оно не используется в качестве публичного идентификатора. Никто не должен знать ваше банковское имя пользователя, кроме вас.
Откуда происходит термин «ручка»?
Ваш следующий вопрос после того, как вы услышите, что это может быть «что такое ручка?» Как оказалось, «ручка» возникла не в Интернете.
Этот термин использовался радио-пользователями CB (Citizens Band) до появления Интернета. Эти люди идентифицировали себя по прозвищам, которые в конечном итоге назывались «ручками».
После того, как в Интернете появились доски объявлений и другие формы обсуждения, люди начали использовать «ручку», чтобы ссылаться на свои имена пользователей.
Где используются социальные ручки?
Как и следовало ожидать, ручки чаще всего встречаются на сайтах социальных сетей.
Поскольку у этих веб-сайтов есть миллионы пользователей, многие из которых имеют схожие или идентичные имена, маркеры социальных сетей позволяют каждому иметь уникальную идентификацию в службе. Таким образом, когда вы создаете учетную запись на сайте социальной сети, он проверяет, что выбранный вами дескриптор еще не занят.
Давайте рассмотрим некоторые из самых популярных сайтов социальных сетей, чтобы увидеть, как они реализуют дескрипторы.
Что такое дескриптор Twitter?
Термин «дескриптор» тесно связан с Twitter, так как сервис уже некоторое время называет свои дескрипторы имен пользователей.
Когда вы создаете учетную запись в Twitter, вы настраиваете уникальный дескриптор для себя. Кроме того, вы можете добавить свое имя и фамилию, которые отличаются от вашей ручки. В приведенном ниже твите вы можете видеть, что мой дескриптор социальной сети — @stegnersaurus , но меня зовут
Это позволяет вам предоставлять больше информации другим. У вас может быть предпочтительный дескриптор, который не имеет никакого отношения к вашему имени, поэтому добавление вашего имени позволяет людям легче вас найти.
Твиттер построен на отправке коротких сообщений, называемых «твиты». Если вы хотите упомянуть другого пользователя в своем твите, вы можете включить его дескриптор, используя символ @ . Например, дескриптор в Twitter — это @ . Ниже приведен пример твита, который включает его:
Включение в твит чьей-либо ручки соцсетей называется «пометка тегами». По умолчанию пометка отправляет этому человеку уведомление. Вы также можете нажать на @handle, чтобы просмотреть профиль этого пользователя.
Посмотрите наше руководство по Twitter. если вам нужна дополнительная помощь, чтобы начать с ним.
Что такое ручка Instagram?
Instagram использует дескрипторы аналогично Twitter. У каждого есть ручка, которая идентифицирует их в сервисе. Если вы хотите пометить кого-либо в сообщении или комментарии, добавьте его дескриптор с символом @ перед ним.
Как и Twitter, он уведомляет человека, которого вы отметили, и позволяет людям нажимать на свое имя, чтобы посетить их страницу. Вы заметите, что ручка человека появляется вверху всего, что он публикует, что позволяет легко его обнаружить.
Что такое дескриптор Facebook?
Facebook немного отличается, когда дело доходит до имен пользователей. Сайт не использует @ handles, как Twitter и Instagram. Это связано прежде всего с тем, что Facebook предназначен для большего количества личных соединений, чем Twitter и Instagram, поэтому он использует ваше настоящее имя при регистрации.
Если вы хотите пометить кого-либо в сообщении или комментарии Facebook, вы все равно можете ввести символ @, а затем его имя. Это уведомляет их о том, что вы упомянули их, и позволяет людям щелкнуть их имя, чтобы увидеть их профиль. Единственное отличие состоит в том, что он использует их настоящее имя вместо имени пользователя и не показывает знак @ .
Тем не менее, Facebook имеет функцию имени пользователя. Его основная цель — предоставить уникальный URL, который идет прямо на вашу страницу.
Вы увидите это на визитных карточках и в рекламных объявлениях компании. У бизнеса часто будет твиттер @handle рядом с логотипом Twitter, а затем /acme.corp рядом с логотипом Facebook. Это позволяет вам знать, что вы можете перейти на Facebook.com/acme.corp, чтобы посетить их.
Вы можете проверить свое имя пользователя, войдя в Facebook, нажав маленькую стрелку в верхнем правом углу и выбрав « Настройки» .
В левой части этой страницы выберите « Общие» , и вы увидите поле « Имя пользователя», в котором вы можете изменить свое имя пользователя. По умолчанию Facebook устанавливает это имя и фамилию, разделенные точкой, что отлично работает.
Если у вас нет одного набора, это хорошая идея, чтобы выбрать один. В противном случае URL вашего профиля будет состоять из случайных чисел, которые нелегко запомнить.
Как выбрать маркер социальной сети
Дескрипторы социальных сетей очень важны для брендов и онлайн-влиятельных людей, которые хотят поддерживать постоянное присутствие в сети. Хотя они не так важны для обычного пользователя, вы все равно можете следовать нескольким общим рекомендациям, чтобы создать надежную ручку.
- Испытанная и верная ручка — ваше имя и фамилия. Нечто похожее на @MarkJohnson не так уж и красиво , но его легко запомнить.
- Если вы не хотите использовать свое настоящее имя, псевдонимы подходят для ручек.
- Чем короче имя пользователя, тем лучше. Чем дольше, тем труднее набирать и запоминать. Там также больше шансов на опечатки.
- Числа могут сделать вашу ручку труднее запомнить, и вы можете выглядеть не оригинально. Это хорошая идея — избегать цифр, если они не связаны с вами, например, номер джерси для спорта.
- Хотите украсить вашу ручку? Попробуйте добавить такие термины, как «Реальный» или «Я» перед вашим именем пользователя. В «TheRealAlexHodges» об этом весело.
- Если служба разрешает вводить заглавные буквы в именах пользователей (Instagram в нижнем регистре), используйте их, чтобы облегчить чтение вашего имени пользователя. «GregWhiteBlogs» более понятен, чем «gregwhiteblogs».
Namechk — отличный ресурс для проверки доступности маркеров социальных сетей. Вы можете ввести интересующее вас имя пользователя и посмотреть сайты, на которых оно уже занято.
Получайте удовольствие, выбирая ваши ручки социальных сетей
В этой статье мы рассмотрели, что такое управление в социальных сетях, как его используют крупнейшие сайты в социальных сетях, и предложили несколько советов по созданию своих собственных. Если вы еще не создали общедоступное имя пользователя, его создание поможет людям найти вас в Интернете.
Оффлайн-события на Facebook (offline-events Facebook). Полное руководство.
Наконец-то, после долгих beta-тестирований и подготовок (а разговоры об этом велись еще с лета 2016) Facebook запустил возможность отслеживания оффлайн-событий (то есть конверсий в реальной жизни, которые состоялись благодаря таргетированной рекламе Facebook). Давайте я поясню еще раз, потому что функция совсем новая: если вы на протяжении пары месяцев крутили таргетинг в Facebook, но не понимали, как он влияет на продажи в вашем магазине, офисе, коворкинге и т.п. – теперь вы можете собрать базу своих покупок оффлайн (или не покупок, а любых других конверсий – главное, чтоб идентификаторы были корректно указаны) и с помощью функции offline-events сопоставить данные. В итоге – система сравнит идентификаторы, указанные в базе, затем идентификаторы пользователей, которые были в ваших рекламных охватах, и ответит на вопрос: «повлиял таргетинг на ваши оффлайн-конверсии или нет; а если да, то как?».
Как по мне – нововведение не только перспективное (что понятно), но и совершенно потрясающее. Хотя работает оно пока не совсем идеально – оно уже похоже на какую-никакую сквозную аналитику. А нам только того и надо.
Официальная справка от самого Facebook находится вот тут.
Ну а я расскажу вам, как это работает «по факту», пошагово и со скринами проведу по процедуре отслеживания offline-events, и даже видео со скринкастом покажу (вместо финала) .
Погнали! (напоминаю, что все изображения кликаются). Для начала – подарок самым ленивым. Видео
1. Прежде всего – заведите себе аккаунт в Бизнес-Менеджере (создать его можно здесь: business.facebook.com ). Без него оффлайн-события отслеживать не удастся. На всякий случай сразу даю ссылку на свой материал о Бизнес-Менеджере – пользуйтесь. Он размещен больше 7 месяцев назад, поэтому скрины слегка напоминают устаревший интерфейс, но принципиально – каким он был, таким он и остался.
2. Откройте меню и выберите в нем «оффлайн-события».
Кликните «создать группу оффлайн-событий».
3. Заполните форму (думаю, очевидно, что «название» и «описание» ни на что не влияет и нужно, чтобы вам самим было удобнее ориентироваться).
4. Назначьте рекламные аккаунты, в которых будет происходить отслеживание конверсий (автоматические подгружаются те, которые привязаны к текущему Бизнес-Менеджеру). Иными словами – именно по рекламным запускам в этих аккаунтах Facebook будет искать соответствия с загружаемой базой оффлайн-конверсий.
5. Выберите людей, которые смогут администрировать оффлайн-события этого аккаунта (то есть манипулировать данными – добавлять, удалять или корректировать базы).
Вот и все. Первая контрольная точка пройдена – группа оффлайн-событий создана.
6. Теперь нам нужно загрузить базу с идентификаторами.
И вот с этого места начинается самое интересное. Файл должен быть, как это обычно бывает, в формате TXT или CSV. Чем больше идентификаторов клиента будет в этом файле – тем лучше (имя, фамилия, e-mail, номер телефона, пол, город, область, и т.п.). Таких идентификаторов Facebook понимает всего 17, и чем больше их в вашей базе – тем точнее сопоставление данных, поэтому не скупитесь. Плюс – файл предусматривает 4 дескриптора (название события, валюта, ценность и время события – пожалуй, наиболее важный).
В чем здесь потенциально могут возникнуть сложности? Разумеется, в сборе идентификаторов оффлайн-клиентов. Я, например, когда обедаю в кафешке – официантам свой номер телефона не оставляю.
В общем, вам нужен механизм сбора данных в оффлайне. Возможные варианты выглядят так:
- CRM (идеально);
- интеграция с бизнес-процессами (например, если вы владеете сетью терминалов – во время любой операции пользователь оставляет свой номер телефона, а иногда и e-mail); но это скорее экзотический случай;
- анкетирование в любом виде (за скидку, за плюшку, за бонусную программу…);
- ваши варианты.
Еще раз напоминаю: чем больше идентификаторов, тем точнее будут итоговые данные.
7. После загрузки файла и клика по кнопке «далее», вам нужно присвоить каждой строке данных правильную категорию. Здесь проще показать на примере, чем пересказывать:
На скрине в красной рамке – данные об именах пользователей (по сути – логины). А раз так – им нужно присвоить категорию «имя».
Если все сделано корректно – у вас появится значок с зеленой галочкой. Это значит, что категория присвоена корректно.
Точно такую же процедуру надо повторить для каждой строки загруженной базы данных, чтобы Facebook их «увидел» и смог корректно сопоставить.
P.S. Обратите внимание, что можно добавлять и индивидуальный тип категоризации. Тогда имя нужно будет тоже присваивать самому.
8. После того, как вы осилите эту часть работы (и перепроверите, что все хорошо) – кликайте «далее».
На скрине вы видите, что у меня не заполнен дескриптор имени. Если у вас такая же история – просто кликните «выбрать значение» и определитесь, какое конкретно событие вы отслеживаете (при этом, обратите внимание, что для отслеживая события «покупка», нужен еще и дескриптор «цена»).
9. Когда все будет готов – кликайте «продолжить» и Facebook начнет свою работу по соотнесению данных. В итоге вы должны увидеть вот такое окно:
Ну и, собственно, ради чего был весь сыр-бор:
Как видите, применительно к той базе, с которой я работал – Facebook нашел 140 совпадений. Это значит, что из 285 пользователей, попавших в мою базу конверсий – 140 попали в нее благодаря рекламе. Не так уж плохо, честно говоря (и довольно близко к истине). Будет больше идентификаторов – будут чище данные.
10. Последнее по порядку, но не по значению – на основании отслеженного события можно собрать lookalike-аудиторию. Для этого просто кликните “Создать аудиторию” и заполните три поля, которые форма у вас запросит (они настолько просты, что я их даже комментировать не стану).
Вот и все. Надеюсь, вы настолько же exciting, насколько и я.
P.S. Ну, а чтобы все это окончательно улеглось в стройную систему – посмотрите видео. Оно о том же, о чем и статья – только наглядно и с еще большими лучами любви.
Оставляйте комментарии. И удачи с отслеживанием конверсий – потому что это чертовски, чертовски важно!
Ads Manager
Facebook Ads Manager — это рекламный кабинет для создания и управления рекламой в сервисах и соцсетях, принадлежащих компании Facebook. В нем рекламодатели могут запускать рекламу, отслеживать работу кампаний, вносить корректировки и оценивать результаты размещения.
Термин из категории
Facebook Ads
18 терминов
Что такое Facebook Ads Manager простыми словами
Это кабинет, созданный Facebook для своих рекламодателей. Его можно использовать не только для запуска кампаний, но и для оценки их результатов. В отчетах Ads Manager рекламодатели могут использовать разбивку для просмотра интересующих метрик на уровне кампании, группы объявлений и отдельного объявления.
Что может делать специалист в Ads Manager
- в социальной сети Facebook;
- в соцсети Instagram;
- в сервисе для звонков и обмена сообщениями Messenger;
- в Audience Network — партнерской сети сайтов и приложений, не принадлежащих Facebook.
Также в Facebook Ads можно настроить рекламу, приводящую в мессенджер WhatsApp — там потенциальные клиенты могли сразу связаться с бизнесом, написав сообщение. Однако в самом WhatsApp рекламы нет, он доступен лишь как вариант направления трафика с рекламы.
Вносить корректировки сразу в несколько объявлений. В Ads Manager можно редактировать настройки после запуска рекламы, например, изменять аудиторию, бюджет и места показа рекламы.
Оценивать результаты продвижения. В рекламном кабинете специалист сможет получить статистику по рекламным кампаниям и сформировать пользовательские отчеты с нужными метриками. Можно просматривать данные по всем кампаниям на уровне аккаунта или по отдельным объявлениям.
Где находится Facebook Ads Manager
Чтобы попасть в Ads Manager, нужно зайти в бизнес-профиль в Facebook и кликнуть на раздел Ads Manager в меню слева.
Также можно перейти в Ads Manager по прямой ссылке facebook.com/adsmanager/manage/campaigns.
В AdsManager вы увидите четыре вкладки: Центр ресурсов, где собраны важные уведомления, и три раздела для управления кампаниями, группами объявлений и конкретными креативами.
Чтобы запустить рекламу, нужно нажать на кнопку «Создать» и выбрать цель кампании. Ads Manager подскажет, какие задачи поможет решить каждая из целей. От цели будут зависеть другие настройки.